-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
PostScript:
Якщо вам дійсно потрібно передати змінну для імені сценарію, те, що ви робите, буде залежати від того, визначена змінна локально або віддалено. Загалом, якщо у вас є змінна $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)