-ArgumentList
是基于与 脚本块 命令一起使用的,例如:
Invoke-Command -Cn (gc Servers.txt) {param($Debug=$False, $Clear=$False) C:\Scripts\ArchiveEventLogs\ver5\ArchiveEventLogs.ps1 } -ArgumentList $False,$True
当你使用
-File
调用时,它仍然像一个愚蠢的 splatted 数组传递参数。我已经提交了一个
功能请求,以便将其添加到命令中(请投票支持)。
所以,你有两个选择:
如果你有一个像这样的脚本,在远程机器可以访问的网络位置上(请注意,因为我使用了
Parameter
属性,所以
-Debug
是隐含的,因此所有常见的参数都会进入脚本的 CmdletBinding):
param(
[Parameter(Position=0)]
$one
,
[Parameter(Position=1)]
$two
,
[Parameter()]
[Switch]$Clear
)
"The test is for '$one' and '$two' ... and we $(if($DebugPreference -ne 'SilentlyContinue'){"will"}else{"won't"}) run in debug mode, and we $(if($Clear){"will"}else{"won't"}) clear the logs after."
不必纠结于$Clear
的含义……如果你想要调用它,可以使用以下任意一种Invoke-Command
语法:
icm -cn (gc Servers.txt) {
param($one,$two,$Debug=$False,$Clear=$False)
C:\Scripts\ArchiveEventLogs\ver5\ArchiveEventLogs.ps1 @PSBoundParameters
} -ArgumentList "uno", "dos", $false, $true
在这个例子中,我会复制所有我关心的参数到 scriptblock 中,以便传递值。如果可以硬编码它们(这实际上是我所做的),那么就不需要使用 PSBoundParameters
,只需传递我需要的参数即可。在下面的第二个例子中,我将传递 $Clear 参数,以演示如何传递开关参数:
icm -cn $Env:ComputerName {
param([bool]$Clear)
C:\Scripts\ArchiveEventLogs\ver5\ArchiveEventLogs.ps1 "uno" "dos" -Debug -Clear:$Clear
} -ArgumentList $(Test-Path $Profile)
另一种选择
如果脚本在您的本地计算机上,并且您不想更改参数以使其成为位置参数,或者您想指定作为公共参数(因此您无法控制它们)的参数,则需要获取该脚本的内容并将其嵌入到您的脚本块中:
$script = [scriptblock]::create( @"
param(`$one,`$two,`$Debug=`$False,`$Clear=`$False)
&{ $(Get-Content C:\Scripts\ArchiveEventLogs\ver5\ArchiveEventLogs.ps1 -delimiter ([char]0)) } @PSBoundParameters
"@ )
Invoke-Command -Script $script -Args "uno", "dos", $false, $true
后记:
如果你真的需要传递一个变量作为脚本的名称,那么你需要区分这个变量是在本地定义的还是在远程定义的。一般来说,如果你有一个叫做$Script
的变量或者一个叫做$Env:Script
的环境变量存储了脚本的名称,你可以通过调用运算符(&)来执行它:&$Script
或者 &$Env:Script
如果这个变量已经是远程计算机上已经定义好的环境变量,那么你只需要这样做就可以了。但如果这个变量只在本地定义,那么你需要将它传递到远程脚本块中。
Invoke-Command -cn $Env:ComputerName {
param([String]$Script, [bool]$Clear)
& $ScriptPath "uno" "dos" -Debug -Clear:$Clear
} -ArgumentList $ScriptPath, (Test-Path $Profile)