Powershell ScriptBlock不执行

我试图使用invoke-command在远程机器上执行代码。 该方法的一部分包括一个ScriptBlock参数,我知道我没有做正确的事情。

首先,我尝试在脚本中创build一个方法,如下所示:

 param([string] $filename) function ValidatePath( $file, $fileType = "container" ) { $fileExist = $null if( -not (test-path $file -PathType $fileType) ) { throw "The path $file does not exist!" $fileExist = false } else { echo $filename found! $fileExist = true } return $fileExist } $responseObject = Invoke-Command -ComputerName MININT-OU9K10R -ScriptBlock{validatePath($filename)} -AsJob $result = Receive-Job -id $responseObject.Id echo $result 

要调用这个,我会这样做.\myScriptName.ps1 -filename C:\file\to\test 。 该脚本将执行,但不会调用该函数。

然后我想,也许我应该把这个function放到一个新的脚本中。 这看起来像:

文件1:

 $responseObject = Invoke-Command -ComputerName MININT-OU9K10R -ScriptBlock { .\file2.ps1 -filename C:\something } -AsJob $result = Receive-Job -id $responseObject.Id echo $result 

文件2:

 Param([string] $filename) 

这两种方法都不会执行这个function,我想知道为什么; 或者,我需要做些什么来使其工作。

 function ValidatePath( $file, $fileType = "container" ) { $fileExist = $null if( -not (test-path $file -PathType $fileType) ) { throw "The path $file does not exist!" $fileExist = false } else { echo $filename found! $fileExist = true } return $fileExist } 

Solutions Collecting From Web of "Powershell ScriptBlock不执行"

这是因为Invoke-Command在远程计算机的脚本块中执行代码。 远程计算机上没有定义ValidatePath函数,而脚本文件file2.ps1在那里不存在。 没有任何东西可以让远程计算机访问执行Invoke-Command的脚本中的代码或运行脚本的计算机上的文件。 您需要将file2.ps1复制到远程计算机,或将其提供给计算机上共享该文件的共享的UNC路径,或者将ValidatePath函数的内容放在脚本块中。 确保将$ file的所有实例更改为$ filename ,反之亦然,并使代码交互式运行,例如,您将消除$ fileExistreturn语句。

要将路径验证代码放在传递给远程计算机的scriptblock中,你可以这样做:

 $scriptblock = @" if (-not (Test-Path $filename -PathType 'Container') ) { throw "The path $file does not exist!" } else { echo $filename found! } "@ $responseObject = Invoke-Command -ComputerName MININT-OU9K10R -ScriptBlock{$scriptblock} -AsJob 

注意确保“@不缩进,它必须在行的开头。

顺便说一句,虽然这是没有争议的,那么在抛出语句后立即设置变量有什么意义? 一旦你抛出一个错误,函数终止。 $fileExist = false在任何情况下都不会执行。 您可能想要使用写入错误