How to pass parameters to powershell command when interpreting script from standard input

戏子无情 提交于 2019-12-02 06:52:59

问题


I am running powershell script over ssh as ssh user@host "powershell -Comand - < script.ps1. It works as expected as long as I start passing arguments.

When I put it as powershell -Command - my args it fails (as documented) '-' was specified with the -Command parameter; no other arguments to -Command are permitted.

While the other way around powershell my args -Command - it fails with:

The term 'my' is not recognized as the name of a cmdlet, function, script file,
 or operable program. Check the spelling of the name, or if a path was included
, verify that the path is correct and try again.
At line:1 char:3
    + my <<<<  args -Command -
    + CategoryInfo          : ObjectNotFound: (my:String) [], CommandNotFoundE 
   xception
    + FullyQualifiedErrorId : CommandNotFoundException

I intend to put in arbitrary list of parameter without any parsing.

Edit:

As I investigate further, it seems I am doing something wrong even when the command is specified explicitly:

(local bash) $ echo '\n' | ssh -i master-key Admin@10.8.55.78 '$SYSTEMROOT/System32/WindowsPowerShell/v1.0/powershell' -Command 'Write-Host \$\(\$args.Count\)' "my" "args"
0 my args

It seems that passes no arguments but they are printed on console for some reason. Avoiding the ssh does not seems to change anything:

(cygwin) $ $SYSTEMROOT/System32/WindowsPowerShell/v1.0/powershell -Command 'Write-Host $($args.Count)' "my" "args"
0 my args

回答1:


You can't do that directly, but I think this can be done, if you wrap your script in scriptblock and pass arguments to it:

echo "& { $(cat script.ps1) } 'my' 'args'" | ssh user@host "powershell -Command"

Since -Command parameter can't handle multiline strings, there is a way to pass it in (though not via standard input) using Base64 encoded value of -EncodedCommand parameter, but it's ugly:

ssh user@host "powershell -encodedcommand $((echo "& {"; cat script.ps1 ; echo "} 'my' 'args'") |  iconv -f ascii -t utf-16le | base64 -w0 ; echo -e "\n")



回答2:


This one works as expected:

script=$(cat <<-'SCRIPT'
{ 
    $a=$Args[0];
    $b=$Args[1];
    # Do not enclose $script into "" to avoid this comment spread till the EOL
    Write-Host "This is 'a': $a";
    Write-Host "This is 'b': $b";
} # <- call as [[[ -c "& { $script } ... " ]]] if you ommit braces '{}' here 
SCRIPT
)
a="THE VALUE OF THE \"a\""
b="B B B B"
powershell -nologo -executionpolicy bypass  -c "& $script '$a' '$b'"

output:

> This is 'a': THE VALUE OF THE "a"
> This is 'b': B B B B


来源:https://stackoverflow.com/questions/33283997/how-to-pass-parameters-to-powershell-command-when-interpreting-script-from-stand

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!