Иногда бывает необходимо получить какое либо значение, поместить его в переменную и затем использовать эту переменную в удаленной сессии PowerShell. Однако по умолчанию переменные в удаленных сессиях не определены, поэтому нельзя просто задать переменную в локальной сессии, а потом использовать в удаленной.
Для примера создадим в текущем сеансе переменную $path, указывающую на директорию C:\Users, и затем выведем ее содержимое:
$path = ″C:\Users″
Get-ChildItem $path
Теперь создадим удаленную сессию на сервере SRV2 и попробуем выполнить в ней ту же команду:
$session = New-PSSession -ComputerName SRV2
Invoke-Command -Session $session -ScriptBlock {Get-ChildItem $path}
Поскольку переменная $path не определена в удаленной сессии, то результата мы не получим. Для успешного выполнения команды необходимо передать локальную переменную $path в удаленную сессию. Для этого есть пара способов, например можно передать переменную в качестве параметра, вот так:
Invoke-Command -Session $session -ScriptBlock {param($path) Get-ChildItem $path} -Arg $path
Как вариант, для удаленных команд можно использовать область видимости переменной Using, указав что переменная определена в локальном сеансе. В нашем случае команда будет выглядеть так:
Invoke-Command -Session $session -ScriptBlock {Get-ChildItem $Using:path}
Примечание. Первый способ подходит для любой версии PowerShell, второй можно использовать только в PowerShell 3.0 и выше.
$var = gc $env:USERPROFILE\Desktop\file.txt # массив строк
icm $comp -cr $cred -sc {param($var); Out-File $env: -i $env:USERPROFILE\Desktop\file.txt $var} -arg $var
Запишет только одну строчку.