Вызовите 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"

Вот оно!