ArgumentList est basé sur l'utilisation avec scriptblock les commandes, telles que:
Invoke-Command -Cn (gc Servers.txt) {param($Debug=$False, $Clear=$False) C:\Scripts\ArchiveEventLogs\ver5\ArchiveEventLogs.ps1 } -ArgumentList $False,$True
Lorsque vous appelez avec un -Fichier-il encore transmet les paramètres comme un idiot splatted tableau. J'ai soumis une demande de fonctionnalité à ajouter à la commande (s'il vous plaît voter jusqu').
Donc, vous avez deux options:
Si vous avez un script qui ressemble à ceci, dans un emplacement réseau accessible à partir de la machine distante (notez que le Débogage est implicite car lorsque j'utilise l' Parameter
d'attribut, le script est CmdletBinding implicitement, et par conséquent, tous les paramètres communs):
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."
Sans obtenir accroché sur le sens de l' $Clair ... si vous voulait invoquer que vous pouvez utiliser l'une des opérations suivantes Invoke-Command syntaxes:
icm -cn (gc Servers.txt) {
param($one,$two,$Debug=$False,$Clear=$False)
C:\Scripts\ArchiveEventLogs\ver5\ArchiveEventLogs.ps1 @PSBoundParameters
} -ArgumentList "uno", "dos", $false, $true
Dans celui-là, je suis à la duplication de TOUS les paramètres-je me soucier de la scriptblock afin que je puisse transmettre des valeurs. Si je peux coder en dur (qui est ce que j'ai fait), il n'y a pas besoin de le faire et utiliser PSBoundParameters
, je peux juste passer ceux que j'en ai besoin. Dans le deuxième exemple ci-dessous, je vais passer le $Clair, afin de démontrer comment passer les paramètres de commutateur:
icm -cn $Env:ComputerName {
param([bool]$Clear)
C:\Scripts\ArchiveEventLogs\ver5\ArchiveEventLogs.ps1 "uno" "dos" -Debug -Clear:$Clear
} -ArgumentList $(Test-Path $Profile)
L'autre option
Si le script est en local sur votre machine, et que vous ne souhaitez pas modifier les paramètres de position, ou si vous souhaitez spécifier des paramètres sont des paramètres Communs (de sorte que vous ne pouvez pas les contrôler), vous voulez obtenir le contenu de ce script et l'incorporer dans votre 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
Post-scriptum:
Si vous avez vraiment besoin de passer par une variable pour le nom du script, ce que vous feriez dépendra si la variable est définie localement ou à distance. En général, si vous avez une variable $Script ou une variable d'environnement $Env:Script avec le nom d'un script, vous pouvez l'exécuter avec l'opérateur d'appel (&): &$Script
ou &$Env:Script
Si c'est une variable d'environnement qui est déjà défini sur l'ordinateur distant, c'est tout là est à lui. Si c'est un local variable, alors vous aurez à passer à la télécommande bloc de script:
Invoke-Command -cn $Env:ComputerName {
param([String]$Script, [bool]$Clear)
&$Script "uno" "dos" -Debug -Clear:$Clear
} -ArgumentList $ScriptPath, $(Test-Path $Profile)