Вам не хватает двух ключевых вещей:
args
- который захватывает все (и только) несвязанные аргументы скрипта - splatting (
@
) - который используется для передачи массивов или хеш-таблиц в команду, а не для их выравнивания, как если бы вы получили $
Когда вы объединяете их, вы можете легко передать все аргументы в другой скрипт, например, так:
# foo.ps1
. common.ps1 @args
С источником файла, подобным этому:
#common.ps1
param ([string]$foo = "foo")
echo "`$foo is $foo"
Вы получаете следующие выходные данные:
> foo.ps1
возвращает $foo is foo
> foo.ps1 -Foo bar
возвращает $foo is bar
Обратите внимание, что если вы пытаетесьиспользуйте PowerShell ISE, чтобы выяснить это или отладить что-либо из этого, может потребоваться некоторое время.Когда вы находитесь в отладчике, $ args и $ MyInvocation.UnboundArguments приложат все усилия, чтобы скрыть эту информацию от вас.Они будут казаться полностью пустыми.
Вы можете напечатать аргументы с помощью >> echo "$(@args)"
, но это также обеспечивает очень странный побочный эффект при отладчике продолжать.Я думаю, что сплаттинг добавляет дополнительную новую строку, и это заканчивается в Командном окне.
Лучший обходной путь, который у меня есть для этого, это добавить $theargs = $args
вверху вашего скрипта и не забывать использовать $theargs
в отладчике.