Вызовите PowerShell script с аргументами из другой powershell script
Как вы называете PowerShell script, который принимает именованные аргументы из PowerShell script?
foo.ps1:
param(
[Parameter(Mandatory=$true)][String]$a='',
[Parameter(Mandatory=$true)][ValidateSet(0,1)][int]$b,
[Parameter(Mandatory=$false)][String]$c=''
)
#stuff done with params here
bar.ps1
#some processing
$ScriptPath = Split-Path $MyInvocation.InvocationName
$args = "-a 'arg1' -b 2"
$cmd = "$ScriptPath\foo.ps1"
Invoke-Expression $cmd $args
Ошибка:
Invoke-Expression : A positional parameter cannot be found that accepts
argument '-a MSFT_VirtualDisk (ObjectId =
"{1}\\YELLOWSERVER8\root/Microsoft/Windo...).FriendlyName -b 2'
Это моя последняя попытка - я пробовал несколько методов из googling, которые, похоже, не работают.
Если я запустил foo.ps1 из терминала оболочки как ./foo.ps1 -a 'arg1' -b 2
, он работает как ожидалось.
Ответы
Ответ 1
После публикации вопроса я наткнулся на ответ. Для полноты здесь это:
bar.ps1:
#some processing
$ScriptPath = Split-Path $MyInvocation.InvocationName
$args = @()
$args += ("-a", "arg1")
$args += ("-b", 2)
$cmd = "$ScriptPath\foo.ps1"
Invoke-Expression "$cmd $args"
Ответ 2
Вот что может помочь будущим читателям:
foo.ps1:
param ($Arg1, $Arg2)
Обязательно размещайте код "param" вверху перед любым исполняемым кодом.
bar.ps1:
& "path to foo\foo.ps1" -Arg1 "ValueA" -Arg2 "ValueB"
Вот оно!