Scriptblock 中的全局范围变量为空

7 powershell powershell-3.0

运行以下代码会产生错误,因为用于 path 的变量虽然在脚本中定义,但被解析为 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 
Run Code Online (Sandbox Code Playgroud)

如何从 ScriptBlock 中调用父脚本中定义的 $RemotePath?我需要在父脚本的其他部分使用 $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 
Run Code Online (Sandbox Code Playgroud)

Tes*_*ler 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
Run Code Online (Sandbox Code Playgroud)

(不过,我可能会称之为 $LocalPath)