81 votes

Comment passer des paramètres nommés avec Invoke-Command?

J'ai un script que je peux exécuter à distance via Invoke-Command

 Invoke-Command -ComputerName (Get-Content C:\Scripts\Servers.txt) -FilePath C:\Scripts\ArchiveEventLogs\ver5\ArchiveEventLogs.ps1
 

Tant que j'utilise les paramètres par défaut, cela fonctionne bien. Cependant, le script a 2 paramètres nommés [switch] (-Debug et -Clear)

Comment puis-je transmettre les paramètres commutés via la commande Invoke? J'ai essayé le -ArgumentList mais je reçois des erreurs, donc la syntaxe doit être incorrecte ou quelque chose du genre. Toute aide est grandement appréciée.

102voto

Jaykul Points 6484

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)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X