Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Как пересчитывают значение переменных (http://forum.oszone.net/showthread.php?t=309031)

c4uran 10-12-2015 16:03 2583430

Как пересчитывают значение переменных
 
В связи с попытками разобраться с 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 2583445

c4uran, В данном случае если нет файлов в TestFolder, то и не будет переменной $files, соответственно и не будет $files.count. Проверяйте определение переменной:
Код:

if (!$files) { CreateFile }

Iska 10-12-2015 19:00 2583500

Цитата:

Цитата c4uran
но нет ли способа $files.count в скобки какие нибудь взять или не знаю... обновить переменную »

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

c4uran 14-12-2015 10:59 2584645

А подскажите как экранируются в этом случае переменная: $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 2584648

Также и экранируются:

Код:

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

c4uran 14-12-2015 11:26 2584652

Kazun, не работает вываливает такое:


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

Kazun 14-12-2015 11:35 2584658

А если так?

Код:

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

c4uran 14-12-2015 11:45 2584659

так работает:

Код:

{ & cmd.exe /c """$Command"" " }
а с аргументами нет:

Код:

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

Iska 14-12-2015 11:57 2584666

Переведу:
Цитата:

Цитата c4uran
*Ґ пў«пҐвбп ў*гваҐ**Ґ© Ё«Ё ў*Ґи*Ґ© »

«Не является внутренней или внешней…».

Foreigner 14-12-2015 11:59 2584669

c4uran, В переменную $Command поместите всю команду, с аргументами:
Код:

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


Kazun 14-12-2015 12:30 2584680

Код:

$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 2584733

Kazun, Да так сработало, спасибо, а почему $Command пришлось вставлять в параметры и в -ArgumentList там же нет аргументов, напишите плиз как лучше передавать путь и аргументы в цикл (хочу написать скрипт по авто-установке тонны софта на тонну компьютеров)

Foreigner, Ваша запись не сработала (сложность в том что путь к исполняющему файлу написан через пробел и поэтому его необходимо взять в кавычки и передать вместе с аргументами)

Georgio, Ваша запись тоже не сработала :( не знаю почему

Iska, А не подскажите почему у меня в ISE вываливаются такие знаки?

Спасибо всем кто отвечает без вас было бы на много сложнее разобраться во всем этом аде!

greg zakharov 14-12-2015 15:26 2584740

Цитата:

Цитата Iska
Нет. Переменную с уже полученными объектами никак не «обновить».

Код:

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 2584766

Цитата:

Цитата c4uran
Iska, А не подскажите почему у меня в ISE вываливаются такие знаки? »

Некорректно использована кодировка. Т.е., вывод приложения идёт в одной кодировке, а ISE пытается его читать в другой кодировке.

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

c4uran 15-12-2015 11:05 2585015

Подскажите такой момент:

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

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 2585320

Спасибо! а как такую запись на batch можно сделать в конвейере PS:

Код:

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

Kazun 16-12-2015 09:54 2585322

Код:

[bool](dir *myfile* -ea 0)

c4uran 16-12-2015 10:37 2585337

т.е полная запись выглядит так:

Код:

if ([bool](dir c:\*.txt -ea 0) -eq $true) { echo "found!"} else { echo "not found!" }
а как можно без If ?

Kazun 16-12-2015 11:46 2585352

Код:

if ((dir c:\*.txt -ea 0)) { "found!"} else { "not found!" }

c4uran 17-12-2015 11:19 2585646

Kazun, If здесь все же присутствует


По поводу пересчета переменных, как тогда записать такой пример:

Код:

Invoke-Command -ComputerName 'computername' -ScriptBlock { gwmi win32_product }
если такая запись вываливает ошибку:

Код:

$command = gwmi win32_product
Invoke-Command -ComputerName 'computername' -ScriptBlock { $command }


Foreigner 17-12-2015 11:25 2585650

c4uran, Может будет проще без Invoke-Command? У Get-WmiObject есть параметр -ComputerName

Kazun 17-12-2015 12:49 2585694

Код:

$command = {gwmi win32_product}
Invoke-Command -ComputerName 'computername' -ScriptBlock $command


c4uran 17-12-2015 14:44 2585759

Kazun, То что нужно!

какую роль играют скобки в переменной в этом случае?

Foreigner, Тоже правда но интересно как работает invoke

Kazun 17-12-2015 16:49 2585799

about_Script_Blocks - https://technet.microsoft.com/en-us/.../hh847893.aspx


Время: 08:32.

Время: 08:32.
© OSzone.net 2001-