【问题标题】:Global scope variable is null within Scriptblock脚本块中的全局范围变量为空
【发布时间】:2014-07-16 11:47:52
【问题描述】:

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

$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。注意,这个值不会改变,所以它可以是一个常数。

更新——工作解决方案

您必须将变量作为参数传递给脚本块:

$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 

【问题讨论】:

  • 使用可以尝试使用 $global:RemotePath = "C:\Test\" 作为全局变量,可以在整个脚本文件的任何地方访问
  • 试过了,不行。
  • $using:RemotePath 工作吗?

标签: powershell powershell-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)

【讨论】:

  • 在这个父脚本中定义一个全局变量,以便我可以在脚本块和父脚本中使用它?否则,我需要在脚本中维护重复的变量,因为我需要在脚本块之外的其他位置使用它。注意,这个值不会改变,所以它可以是一个常数。
  • 是的,虽然我没有尝试过 - powershell.com/cs/blogs/tips/archive/2012/10/26/… 似乎会有所帮助。
  • 感谢您评论中的链接,我让它工作了。我将在上面添加更新,以便其他人可以看到解决方案。谢谢。
【解决方案2】:

试试这个语法:

$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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-16
      • 2015-09-30
      • 2012-04-29
      • 2017-02-17
      • 1970-01-01
      相关资源
      最近更新 更多