运行以下代码会产生错误,因为用于路径的变量虽然在脚本中定义,但仍被解析为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
答案 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