Использование команды Invoke-Command Powershell для вызова пакетного файла с аргументами

Я хочу использовать PowerShell для вызова пакетного файла на удаленной машине. Этот пакетный файл имеет аргументы. Вот что у меня пока есть:

$script = "filesharescript.cmd"
$server = $args[0]
$args [string]::join(',',$args[1 .. ($args.count-1)])

Invoke-Command -computername $server {$script + ' ' + $args}

после небольшого поиска я обнаружил, что функция Invoke-Command запускает свой scriptblock в совершенно новом процессе, поэтому вы не можете поместить в него переменные (они не будут расширяться). Вот для чего предназначен тег-ArgumentList. Поэтому я попробовал это...

Invoke-Command -computername $server {filesharescript.cmd} -ArgumentList "FirstArgument"

это тоже не сработало... мой пакетный сценарий говорит мне, что никаких аргументов. Я не могу найти ничего, что явно говорит об этом, но похоже, что параметр-ArgumentList работает только на сценариях Powershell (он не будет передавать их в пакетный скрипт).

любые идеи, как я могу использовать Invoke-Command для вызова пакетного файла с аргументами?

2 ответов


когда вы передаете список аргументов в scriptblock, попробуйте "получить их", используя директиву PARAM. Вот так:

Invoke-Command -computername $server {PARAM($myArg) \fileshare\script.cmd $myArg} -ArgumentList "FirstArgument"

или вы можете просто использовать автоматическую переменную $args:

Invoke-Command -computername $server {\fileshare\script.cmd $args} -ArgumentList "FirstArgument"

аргументы будут переданы в качестве аргументов scriptblock, а не непосредственно в cmd. Вы должны сделать:

Invoke-Command {param($script,$arg1) &$script $arg1 } -computername $server -ArgumentList $script,"FirstArgument"

или

Invoke-Command {&$args[0] $args[1] } -computername $server -ArgumentList $script,"FirstArgument"

PS: Я не знаю, что вы делаете с $args [string]::join(',',$args[1 .. ($args.count-1)]), это синтаксическая ошибка