-ArgumentList
基于与scriptblock命令一起使用,例如:
Invoke-Command -Cn (gc Servers.txt) {param($Debug=$False, $Clear=$False) C:\Scripts\ArchiveEventLogs\ver5\ArchiveEventLogs.ps1 } -ArgumentList $False,$True
当你用 a 调用它时,-File
它仍然像一个哑弹数组一样传递参数。我已经提交了一个功能请求,将其添加到命令中(请投票)。
所以,你有两个选择:
如果您有一个看起来像这样的脚本,位于可从远程计算机访问的网络位置(请注意,这-Debug
是隐含的,因为当我使用该Parameter
属性时,脚本会隐式获取 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
在那一个中,我在脚本块中复制了我关心的所有参数,以便我可以传递值。如果我可以对它们进行硬编码(这是我实际所做的),则无需这样做并使用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)