Войти

Показать полную графическую версию : Как пересчитывают значение переменных


Страниц : [1] 2

c4uran
10-12-2015, 16:03
В связи с попытками разобраться с 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 }

Iska
10-12-2015, 19:00
но нет ли способа $files.count в скобки какие нибудь взять или не знаю... обновить переменную »
Нет. Переменную с уже полученными объектами никак не «обновить». Вам так или иначе придётся заново «опросить» каталог, будь то «Get-ChildItem … -File» или «([System.IO.DirectoryInfo]'…').GetFiles()» и т.п.

c4uran
14-12-2015, 10:59
А подскажите как экранируются в этом случае переменная: $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" }

а первый пример - нет

Kazun
14-12-2015, 11:16
Также и экранируются:

cmd.exe /c """$Command"" /L=1033 /S"

c4uran
14-12-2015, 11:26
Kazun, не работает вываливает такое:


+ CategoryInfo : NotSpecified: ("/L" *Ґ пў«пҐвбп ў*гваҐ**Ґ© Ё«Ё ў*Ґи*Ґ©:String) [], RemoteException
+ FullyQualifiedErrorId : NativeCommandError
+ PSComputerName : computer

Kazun
14-12-2015, 11:35
А если так?

cmd.exe /c """$Command"" ""/L=1033"" /S"

c4uran
14-12-2015, 11:45
так работает:

{ & cmd.exe /c """$Command"" " }

а с аргументами нет:

"""$Command"" ""/L=1033"" /S"

+ CategoryInfo : NotSpecified: ("" "" *Ґ пў«пҐвбп ў*гваҐ**Ґ© Ё«Ё ў*Ґи*Ґ©:String) [], RemoteException
+ FullyQualifiedErrorId : NativeCommandError

Iska
14-12-2015, 11:57
Переведу:
*Ґ пў«пҐвбп ў*гваҐ**Ґ© Ё«Ё ў*Ґи*Ґ© »
«Не является внутренней или внешней…».

Foreigner
14-12-2015, 11:59
c4uran, В переменную $Command поместите всю команду, с аргументами:

$command = "dir /b D:\"
$invoke-command -script { cmd /c $command }

Kazun
14-12-2015, 12:30
$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}

c4uran
14-12-2015, 14:43
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
14-12-2015, 16:31
Iska, А не подскажите почему у меня в ISE вываливаются такие знаки? »
Некорректно использована кодировка. Т.е., вывод приложения идёт в одной кодировке, а ISE пытается его читать в другой кодировке.

greg zakharov, там сам экземпляр объекта обновляет свои свойства, следя за файловой системой. Согласитесь, это совсем не то, о чём говорил автор.

c4uran
15-12-2015, 11:05
Подскажите такой момент:

в одной директории лежат 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

c4uran
16-12-2015, 09:44
Спасибо! а как такую запись на batch можно сделать в конвейере PS:

dir c: | findstr /i "myfile"&& echo Found! || echo Not Found!

Kazun
16-12-2015, 09:54
[bool](dir *myfile* -ea 0)

c4uran
16-12-2015, 10:37
т.е полная запись выглядит так:

if ([bool](dir c:\*.txt -ea 0) -eq $true) { echo "found!"} else { echo "not found!" }

а как можно без If ?

Kazun
16-12-2015, 11:46
if ((dir c:\*.txt -ea 0)) { "found!"} else { "not found!" }




© OSzone.net 2001-2012