-ArgumentList
основан на использовании с scriptblock командами, такими как:
Invoke-Command -Cn (gc Servers.txt) {param($Debug=$False, $Clear=$False) C:\Scripts\ArchiveEventLogs\ver5\ArchiveEventLogs.ps1 } -ArgumentList $False,$True
Когда вы вызываете его с -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)
Другой вариант
Если скрипт находится на вашем локальном компьютере, и вы не хотите изменять параметры, чтобы они были позиционными, или вы хотите указать параметры, которые являются общими параметрами (поэтому вы не можете их контролировать), вы захотите получить содержимое этого скрипта и вставьте его в 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
PostScript:
Если вам действительно нужно передать переменную для имени скрипта, то, что вы будете делать, будет зависеть от того, определена ли переменная локально или удаленно. Как правило, если у вас есть переменная $Script
или переменная окружения $Env:Script
с именем сценария, вы можете выполнить ее с помощью оператора вызова (&): &$Script
или &$Env:Script
Если это переменная среды, которая уже определена на удаленном компьютере, это все, что нужно сделать. Если это локальная переменная, вам придется передать ее в удаленный блок скрипта:
Invoke-Command -cn $Env:ComputerName {
param([String]$Script, [bool]$Clear)
&$Script "uno" "dos" -Debug -Clear:$Clear
} -ArgumentList $ScriptPath, $(Test-Path $Profile)