-ArgumentList
basiert auf der Verwendung mit Scriptblock- Befehlen wie:
Invoke-Command -Cn (gc Servers.txt) {param($Debug=$False, $Clear=$False) C:\Scripts\ArchiveEventLogs\ver5\ArchiveEventLogs.ps1 } -ArgumentList $False,$True
Wenn Sie es mit a aufrufen, werden -File
die Parameter immer noch wie ein dummes, bespritztes Array übergeben. Ich habe eine Feature-Anfrage eingereicht , um diese zum Befehl hinzuzufügen (bitte stimmen Sie ab).
Sie haben also zwei Möglichkeiten:
Wenn Sie ein Skript haben, das so aussieht , an einem Netzwerkspeicherort, auf den vom Remotecomputer aus zugegriffen werden kann (dies -Debug
ist impliziert, da Parameter
das Skript bei Verwendung des Attributs implizit CmdletBinding und damit alle allgemeinen Parameter erhält):
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."
Ohne sich auf die Bedeutung von $Clear
... einzulassen, wenn Sie aufrufen möchten, dass Sie eine der folgenden Invoke-Command
Syntaxen verwenden können:
icm -cn (gc Servers.txt) {
param($one,$two,$Debug=$False,$Clear=$False)
C:\Scripts\ArchiveEventLogs\ver5\ArchiveEventLogs.ps1 @PSBoundParameters
} -ArgumentList "uno", "dos", $false, $true
In diesem Fall dupliziere ich ALLE Parameter, die mir im Skriptblock wichtig sind, damit ich Werte übergeben kann. Wenn ich sie hart codieren kann (was ich tatsächlich getan habe), muss ich das nicht tun und verwenden PSBoundParameters
, ich kann nur die übergeben, die ich brauche. Im zweiten Beispiel unten werde ich das $ Clear übergeben, um zu demonstrieren, wie Switch-Parameter übergeben werden:
icm -cn $Env:ComputerName {
param([bool]$Clear)
C:\Scripts\ArchiveEventLogs\ver5\ArchiveEventLogs.ps1 "uno" "dos" -Debug -Clear:$Clear
} -ArgumentList $(Test-Path $Profile)
Die andere Option
Wenn sich das Skript auf Ihrem lokalen Computer befindet und Sie die Parameter nicht so ändern möchten, dass sie positionell sind, oder wenn Sie Parameter angeben möchten, die allgemeine Parameter sind (damit Sie sie nicht steuern können), möchten Sie den Inhalt von erhalten das Skript und binden Sie es in Ihren Skriptblock ein :
$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
PostScript:
Wenn Sie wirklich eine Variable für den Skriptnamen übergeben müssen, hängt es davon ab, ob die Variable lokal oder remote definiert ist. Wenn Sie eine Variable $Script
oder eine Umgebungsvariable $Env:Script
mit dem Namen eines Skripts haben, können Sie diese im Allgemeinen mit dem Aufrufoperator (&) ausführen: &$Script
oder&$Env:Script
Wenn es sich um eine Umgebungsvariable handelt, die bereits auf dem Remotecomputer definiert ist, ist dies alles, was dazu gehört. Wenn es sich um eine lokale Variable handelt, müssen Sie sie an den Remote-Skriptblock übergeben:
Invoke-Command -cn $Env:ComputerName {
param([String]$Script, [bool]$Clear)
& $ScriptPath "uno" "dos" -Debug -Clear:$Clear
} -ArgumentList $ScriptPath, (Test-Path $Profile)