Глобальная переменная области видимости имеет значение null в Scriptblock

Выполнение следующего кода приводит к ошибке, поскольку переменная, используемая для пути, разрешается как нулевое событие, хотя она определена в скрипте:

$ServerName = "test01"
$RemotePath = "C:\Test\"
$TestScriptBlock = { copy-item -Path $RemotePath  -Destination C:\backup\ -Force -Recurse } 
$CurrentSession = New-PSSession -ComputerName $ServerName

Invoke-Command -Session $CurrentSession -ScriptBlock $TestScriptBlock 

Как мне вызвать $RemotePath, определенный в родительском скрипте, из ScriptBlock? Мне нужно использовать $RemotePath в других частях родительского скрипта. Обратите внимание, что это значение не меняется, поэтому оно может быть константой.

ОБНОВЛЕНИЕ — РАБОЧЕЕ РЕШЕНИЕ

Вы должны передать переменную в качестве параметра блоку сценария:

$ServerName = "test01"
$RemotePath = "C:\Test\"
$TestScriptBlock = { param($RemotePath) copy-item -Path $RemotePath  -Destination C:\backup\ -Force -Recurse } 
$CurrentSession = New-PSSession -ComputerName $ServerName

Invoke-Command -Session $CurrentSession -ScriptBlock $TestScriptBlock -ArgumentList $RemotePath 

person Community    schedule 16.07.2014    source источник
comment
можно попробовать использовать $global:RemotePath = C:\Test\ в качестве глобальной переменной, к которой можно получить доступ в любом месте во всем файле сценария.   -  person Nipun    schedule 16.07.2014
comment
пробовал так, не работает.   -  person    schedule 16.07.2014
comment
$using:RemotePath работает?   -  person Dan Stevens    schedule 13.05.2016


Ответы (3)


У вас там два сценария, а не один. $TestScriptBlock — это отдельный скрипт, вложенный в основной, вы отправляете его на удаленный компьютер, и на этом удаленном компьютере не настроен $RemotePath. Пытаться:

$ServerName = "test01"

$TestScriptBlock = {
    $RemotePath = "C:\Test\"
    copy-item -Path $RemotePath  -Destination C:\backup\ -Force -Recurse 
}

$CurrentSession = New-PSSession -ComputerName $ServerName

Invoke-Command -Session $CurrentSession -ScriptBlock $TestScriptBlock

(Тогда я, вероятно, назвал бы это $LocalPath)

person TessellatingHeckler    schedule 16.07.2014
comment
В любом случае, иметь определение одной глобальной переменной в этом родительском скрипте, чтобы я мог использовать ее как в блоке скриптов, так и в родительском скрипте? В противном случае мне нужно будет иметь повторяющиеся переменные для поддержки в сценарии, потому что мне нужно использовать их в других местах за пределами блока сценария. Обратите внимание, что это значение не меняется, поэтому оно может быть константой. - person ; 16.07.2014
comment
Да, может быть, хотя я не пробовал - powershell.com/cs/blogs/tips/archive/2012/10/26/ кажется, что это поможет. - person TessellatingHeckler; 16.07.2014
comment
У меня все получилось благодаря вашей ссылке в вашем комментарии. Я добавлю обновление выше, чтобы другие могли увидеть решение. Спасибо. - person ; 16.07.2014

Попробуйте этот синтаксис:

$globalvariable1 = "testoutput01"
$globalvariable2 = "testoutput02"

$Scriptblock = {
    Write-Host $using:globalvariable1
    Write-Host $using:globalvariable2
}

$serverName = Domain\HostNameofServer

Invoke-Command -ComputerName $serverName -ScriptBlock $ScriptBlock -ArgumentList $globalvariable1, $globalvariable2
person santoshKalaiselvan    schedule 22.10.2020

Выполнение происходит в другом сеансе, и все переменные в текущей области не копируются в удаленный сеанс по умолчанию. Вы можете использовать либо параметры, либо «using:», как описано здесь:

Как я могу передать локальную переменную блоку сценария, выполняемому на удаленной машине с помощью Invoke-Command?

person jonatasmello    schedule 12.12.2016