2013-07-17 45 views
0

我需要借助CMD的PowerShell运行远程命令。这是我从CMD调用命令:如何使用PowerShell在远程框中为CMD运行正确的命令?

powershell -command "$encpass=convertto-securestring -asplaintext mypass -force;$cred = New-Object System.Management.Automation.PSCredential -ArgumentList myuser,$encpass; invoke-command -computername "REMOTE_COMPUTER_NAME" -scriptblock {<command>} -credential $cred;" 

代替<command>(包括<和>符号)可以是能在cmd.exe的运行的任何命令。例如,可以有perl -e "print $^O;"echo "Hello World!"(注意:不能有perl -e 'print $^O;',因为它是由于单引号导致的CMD命令不正确)。所以看起来命令perl -e "print $^O;"和任何其他包含双引号的命令不按预期方式处理。在这里,我期望它从perl的角度返回远程框的操作系统名称,但由于PowerShell和/或CMD对双引号的处理很模糊,因此它不会打印任何内容。

所以问题是,如何使用PowerShell在远程框中为CMD运行命令正确?

+0

您确定它不是REMOTE_COMPUTER_NAME附近的未转义引号(''')的效果吗? – user268396

+0

@ user268396是的,我一般会尝试使用单引号的REMOTE_COMPUTER_NAME,并且它不会影响我可以肯定地告诉问题是

回答

1

OP中的命令行有几个可能的问题。如果OP中的命令行正在从Powershell本身执行,$ encpass和$ cred将在powershell的(子实例)调用之前被替换。您需要使用单引号或者逃避$迹象,例如:

powershell -command "`$encpass=2" 
powershell -command '$encpass=2' 

如果不是使用PowerShell的命令行从CMD执行,那么^来转义,因为它是CMD转义字符。

和报价“是个好主意,以及在我做我不得不使用不平衡报价去工作的命令,例如,从PowerShell的一些测试:

的powershell -command”`$ `````````````````````````````````` powershell -?

为了避免这一切,或许要做到这一点最稳健的方式在PowerShell命令行帮助给出

# To use the -EncodedCommand parameter: 
$command = 'dir "c:\program files" ' 
$bytes = [System.Text.Encoding]::Unicode.GetBytes($command) 
$encodedCommand = [Convert]::ToBase64String($bytes) 
powershell.exe -encodedCommand $encodedCommand 

但是存在PS 3.0的新功能,也应该帮助,但我认为它不会那么强劲。在这里描述:http://blogs.msdn.com/b/powershell/archive/2012/06/14/new-v3-language-features.aspx,靠近博客的中间。

+0

这不是我想要的,但它帮助我找出问题所在,因此我写了'perl -e'“”print \'$^O; “”“'而不是'perl -e”print $^O;“'并且它可以工作。 –