Показать полную графическую версию : Как пересчитывают значение переменных
В связи с попытками разобраться с PS постоянно появляются вопросы, объясните пожалуйста вот эту простую вещь:
$TestFolder = "c:\temp\testfolder"
$TestFile = $TestFolder + "\newfile.txt"
if (-not(Test-Path $TestFolder)) { New-Item $TestFolder -ItemType "Directory" }
if (Test-Path $TestFile) { Remove-Item $TestFile -Force }
$files = (Get-ChildItem $TestFolder -File)
function CreateFile { IF (-not(Test-Path $TestFolder)) { New-Item $TestFile -ItemType "file" } }
if ($files.count -eq 0) { CreateFile }
if ($files.count -eq 0) { echo "Why count = 0 ?" }
Как пересчитывают значение $files.count заново: $files = (Get-ChildItem $TestFolder -File) - это понятно но нет ли способа $files.count в скобки какие нибудь взять или не знаю... обновить переменную
Foreigner
10-12-2015, 16:40
c4uran, В данном случае если нет файлов в TestFolder, то и не будет переменной $files, соответственно и не будет $files.count. Проверяйте определение переменной:
if (!$files) { CreateFile }
но нет ли способа $files.count в скобки какие нибудь взять или не знаю... обновить переменную »
Нет. Переменную с уже полученными объектами никак не «обновить». Вам так или иначе придётся заново «опросить» каталог, будь то «Get-ChildItem … -File» или «([System.IO.DirectoryInfo]'…').GetFiles()» и т.п.
А подскажите как экранируются в этом случае переменная: $Command
$RemoteHost = "computer1"
$Command = "d:\vlc 210.exe"
Invoke-Command -ComputerName $RemoteHost -ScriptBlock { & cmd.exe /c "$Command /L=1033 /S" }
так она работает:
... {& cmd.exe /c """d:\vlc 210.exe"" /L=1033 /S" }
а первый пример - нет
Также и экранируются:
cmd.exe /c """$Command"" /L=1033 /S"
Kazun, не работает вываливает такое:
+ CategoryInfo : NotSpecified: ("/L" *Ґ пў«пҐвбп ў*гваҐ**Ґ© Ё«Ё ў*Ґи*Ґ©:String) [], RemoteException
+ FullyQualifiedErrorId : NativeCommandError
+ PSComputerName : computer
А если так?
cmd.exe /c """$Command"" ""/L=1033"" /S"
так работает:
{ & cmd.exe /c """$Command"" " }
а с аргументами нет:
"""$Command"" ""/L=1033"" /S"
+ CategoryInfo : NotSpecified: ("" "" *Ґ пў«пҐвбп ў*гваҐ**Ґ© Ё«Ё ў*Ґи*Ґ©:String) [], RemoteException
+ FullyQualifiedErrorId : NativeCommandError
Переведу:
*Ґ пў«пҐвбп ў*гваҐ**Ґ© Ё«Ё ў*Ґи*Ґ© »
«Не является внутренней или внешней…».
Foreigner
14-12-2015, 11:59
c4uran, В переменную $Command поместите всю команду, с аргументами:
$command = "dir /b D:\"
$invoke-command -script { cmd /c $command }
$RemoteHost = "computer1"
$Command = "d:\vlc 210.exe"
Invoke-Command -ComputerName $RemoteHost -ScriptBlock {param($Command) cmd.exe /c """$Command"" /L=1033 /S" } -ArgumentList $Command
-ScriptBlock <ScriptBlock>
By default, any variables in the command are evaluated on the remote computer. To include local variables in the
command, use the ArgumentList parameter.
Для передачи параметров в удаленную сессию, используем параметр ArgumentList.
{param($var1,$var2) Command $var1 $var2}
Или $using:variable:
{Command $using:var}
Kazun, Да так сработало, спасибо, а почему $Command пришлось вставлять в параметры и в -ArgumentList там же нет аргументов, напишите плиз как лучше передавать путь и аргументы в цикл (хочу написать скрипт по авто-установке тонны софта на тонну компьютеров)
Foreigner, Ваша запись не сработала (сложность в том что путь к исполняющему файлу написан через пробел и поэтому его необходимо взять в кавычки и передать вместе с аргументами)
Georgio, Ваша запись тоже не сработала :( не знаю почему
Iska, А не подскажите почему у меня в ISE вываливаются такие знаки?
Спасибо всем кто отвечает без вас было бы на много сложнее разобраться во всем этом аде!
greg zakharov
14-12-2015, 15:26
Нет. Переменную с уже полученными объектами никак не «обновить».
PS D:\src> (gci -r | ? {!$_.PSIsContainer}).Count
128
PS D:\src> $global:count = (gci -r | ? {!$_.PSIsContainer}).Count
PS D:\src> $fsw = New-Object IO.FileSystemWatcher('D:\src', '*.*') -Property @{
>> IncludeSubdirectories = $true
>> NotifyFilter = [IO.NotifyFilters]'FileName'
>> }
>>
PS D:\src> $onc = Register-ObjectEvent $fsw Created -SourceIdentifier FileCreated -Action {
>> $global:count++
>> }
>>
PS D:\src> ni foobar -Type file
Каталог: D:\src
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 14.12.2015 17:25 0 foobar
PS D:\src> $count
129
PS D:\src> [void](ni foobar1 -Type file)
PS D:\src> $count
130
PS D:\src> Unregister-Event -SourceIdentifier FileCreated
PS D:\src>
Iska, А не подскажите почему у меня в ISE вываливаются такие знаки? »
Некорректно использована кодировка. Т.е., вывод приложения идёт в одной кодировке, а ISE пытается его читать в другой кодировке.
greg zakharov, там сам экземпляр объекта обновляет свои свойства, следя за файловой системой. Согласитесь, это совсем не то, о чём говорил автор.
Подскажите такой момент:
в одной директории лежат 2 файла - script.ps1 и functions.ps1
в файле script.ps1 есть строка:
. .\functions.ps1
которая вываливает такую ошибку:
. : Имя "functions.ps1" не распознано как имя командлета,
функции, файла сценария или выполняемой программы.
Проверьте правильность написания имени, а также наличие и
правильность пути, после чего повторите попытку.
+ . functions.ps1
+ ~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (functions.ps1:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
т.е я пытаюсь из скрипта вызвать другой скрипт с функциями, почему он не находит этот файл и вываливает такое?
Foreigner
15-12-2015, 18:45
c4uran, Если запускается из другой директории, то либо пропишите полный путь к functions.ps1, либо используйте автоматическую переменную $myinvocation:
. (join-path (get-item $myinvocation.mycommand.path).directory.fullname functions.ps1)
либо functions.ps1 должен быть в $env:path
Спасибо! а как такую запись на batch можно сделать в конвейере PS:
dir c: | findstr /i "myfile"&& echo Found! || echo Not Found!
[bool](dir *myfile* -ea 0)
т.е полная запись выглядит так:
if ([bool](dir c:\*.txt -ea 0) -eq $true) { echo "found!"} else { echo "not found!" }
а как можно без If ?
if ((dir c:\*.txt -ea 0)) { "found!"} else { "not found!" }
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.