3 回答

TA貢獻(xiàn)1784條經(jīng)驗(yàn) 獲得超9個(gè)贊
-ArgumentList基于與腳本塊命令一起使用,例如:
Invoke-Command -Cn (gc Servers.txt) {param($Debug=$False, $Clear=$False) C:\Scripts\ArchiveEventLogs\ver5\ArchiveEventLogs.ps1 } -ArgumentList $False,$True
當(dāng)您使用a調(diào)用它時(shí),-File它仍會(huì)像啞啞數(shù)組那樣傳遞參數(shù)。我已經(jīng)提交了功能請(qǐng)求,以將其添加到命令中(請(qǐng)對(duì)此進(jìn)行投票)。
因此,您有兩個(gè)選擇:
如果您有一個(gè)看起來像這樣的腳本,那么該腳本位于遠(yuǎn)程機(jī)器可以訪問的網(wǎng)絡(luò)位置(請(qǐng)注意,這-Debug是因?yàn)楫?dāng)我使用該P(yáng)arameter屬性時(shí),該腳本隱式地獲取了CmdletBinding,因此,所有通用參數(shù)也都包含在內(nèi)):
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不想調(diào)用... 的含義,則可以使用以下兩種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
在那篇文章中,我將在腳本塊中復(fù)制我關(guān)心的所有參數(shù),以便可以傳遞值。如果我可以對(duì)它們進(jìn)行硬編碼(這是我實(shí)際上所做的),則無需這樣做并使用PSBoundParameters,我只需傳遞所需的內(nèi)容即可。在下面的第二個(gè)示例中,我將傳遞$ Clear,只是為了演示如何傳遞開關(guān)參數(shù):
icm -cn $Env:ComputerName {
param([bool]$Clear)
C:\Scripts\ArchiveEventLogs\ver5\ArchiveEventLogs.ps1 "uno" "dos" -Debug -Clear:$Clear
} -ArgumentList $(Test-Path $Profile)
另一種選擇
如果腳本在您的本地計(jì)算機(jī)上,并且您不想將參數(shù)更改為位置參數(shù),或者您想指定作為通用參數(shù)的參數(shù)(因此您無法控制它們),則需要獲取以下內(nèi)容:該腳本并將其嵌入到您的scriptblock中:
$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
后記:
如果您確實(shí)需要為腳本名稱傳遞一個(gè)變量,那么您將執(zhí)行的操作將取決于該變量是在本地還是遠(yuǎn)程定義的。在一般情況下,如果你有一個(gè)變量$Script或環(huán)境變量$Env:Script與腳本的名稱,就可以與呼叫運(yùn)營商()執(zhí)行它:&$Script或&$Env:Script
如果它是已經(jīng)在遠(yuǎn)程計(jì)算機(jī)上定義的環(huán)境變量,則僅此而已。如果它是局部變量,則必須將其傳遞給遠(yuǎn)程腳本塊:
Invoke-Command -cn $Env:ComputerName {
param([String]$Script, [bool]$Clear)
&$Script "uno" "dos" -Debug -Clear:$Clear
} -ArgumentList $ScriptPath, $(Test-Path $Profile)

TA貢獻(xiàn)1890條經(jīng)驗(yàn) 獲得超9個(gè)贊
我的解決方案是使用[scriptblock]:Create以下命令動(dòng)態(tài)編寫腳本塊:
# Or build a complex local script with MARKERS here, and do substitutions
# I was sending install scripts to the remote along with MSI packages
# ...for things like Backup and AV protection etc.
$p1 = "good stuff"; $p2 = "better stuff"; $p3 = "best stuff"; $etc = "!"
$script = [scriptblock]::Create("MyScriptOnRemoteServer.ps1 $p1 $p2 $etc")
#strings get interpolated/expanded while a direct scriptblock does not
# the $parms are now expanded in the script block itself
# ...so just call it:
$result = invoke-command $computer -script $script
傳遞參數(shù)是非常令人沮喪,嘗試各種方法,例如
-arguments,$using:p1等,如沒有問題,期望這只是工作。
由于我控制以[scriptblock]這種方式創(chuàng)建(或腳本文件)的字符串的內(nèi)容和變量擴(kuò)展,因此“ invoke-command”命令沒有真正的問題。
(不應(yīng)該那么難。:))

TA貢獻(xiàn)1772條經(jīng)驗(yàn) 獲得超8個(gè)贊
我懷疑這是自創(chuàng)建該帖子以來的一項(xiàng)新功能-使用$ Using:var將參數(shù)傳遞到腳本塊。然后,如果腳本已在計(jì)算機(jī)上或相對(duì)于計(jì)算機(jī)的已知網(wǎng)絡(luò)位置中,則傳遞參數(shù)很簡單
以主要示例為例:
icm -cn $Env:ComputerName {
C:\Scripts\ArchiveEventLogs\ver5\ArchiveEventLogs.ps1 -one "uno" -two "dos" -Debug -Clear $Using:Clear
}
添加回答
舉報(bào)