Scriptblock中的全局范围变量为null

时间:2014-07-16 11:47:53

标签: powershell powershell-v3.0

运行以下代码会产生错误,因为用于路径的变量虽然在脚本中定义,但仍被解析为null事件:

$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 

如何从ScriptBlock中调用父脚本中定义的$ RemotePath?我需要在父脚本的其他部分使用$ RemotePath。注意,此值不会更改,因此它可以是常量。

更新 - 工作解决方案

您必须将变量作为参数传递给scriptblock:

$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 

3 个答案:

答案 0 :(得分:1)

你有两个脚本,而不是一个。 $ 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,但是)

答案 1 :(得分:0)

执行发生在不同的会话中,默认情况下,当前作用域中的所有变量都不会复制到远程会话。 您可以使用任何参数或"使用:"如下所述:

How can I pass a local variable to a script block executed on a remote machine with Invoke-Command?

答案 2 :(得分:0)

尝试以下语法:

$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