使用-EncodedCommand时无法重定向PowerShell输出

时间:2009-04-08 19:42:42

标签: powershell output-redirect

对于我的测试我正在使用'开始>运行'对话框(不是cmd.exe)。

这很好用,我在log.txt中得到9

powershell -Command 4+5 > c:\log.txt

但这不起作用:

powershell -EncodedCommand IAA1ACsANwAgAA== > c:\log.txt

那么在这种情况下如何重定向输出?

实验代码:

function Test
{
    $cmd = { 5+7 }
    $encodedCommand = EncodeCommand $cmd

    StartProcess "powershell -Command $cmd > c:\log.txt"
    StartProcess "powershell -EncodedCommand $encodedCommand > c:\log2.txt"
}

function StartProcess($commandLine)
{
    Invoke-WMIMethod -path win32_process -name create -argumentList $commandLine
}

function EncodeCommand($expression)
{
    $commandBytes = [System.Text.Encoding]::Unicode.GetBytes($expression)
    [Convert]::ToBase64String($commandBytes)
}

3 个答案:

答案 0 :(得分:4)

“运行”对话框似乎根本不提供重定向。 According to this usenet post如果你有一个控制台,你只能获得重定向。我想知道powershell.exe是否正在解析重定向参数,如果它没有接收到编码输入,它会选择重定向?听起来像Raymond Chen的问题。

无论如何,这是有效的,代价是产生一个无用的控制台:

cmd /c powershell -EncodedCommand IAA1ACsANwAgAA== > c:\ps.txt

答案 1 :(得分:2)

这两个命令之间的区别在于-Command参数是贪婪的。它接管命令行后的所有内容,而-EncodedCommand不贪心。第一个命令真正做的是:

powershell -Command "4+5 > c:\log.txt"

因此新的PowerShell实例正在处理重定向。但是,如果使用-EncodedCommand参数,则新的PowerShell实例不会看到重定向,因为您没有将其包含在编码命令中。如果调用PowerShell的环境没有重定向(如在计划任务中),这可能是一件坏事。

因此,正如“crb”所示,您需要将重定向编码到命令中,或者从可以处理重定向的环境(如cmd或其他PowerShell实例)中调用PowerShell。

答案 2 :(得分:1)

我必须将命令与重定向一起编码。

function Test
{
    $cmd = { 5+7 }
    $encodedCommand = EncodeCommand "$cmd > 'c:\log2.log'"

    StartProcess "powershell -Command $cmd > c:\log.txt"
    StartProcess "powershell -EncodedCommand $encodedCommand"
}

所以这会将5 + 7的总和写入c:\ log2.log

powershell -EncodedCommand IAA1ACsANwAgACAAPgAgACcAYwA6AFwAbABvAGcAMgAuAGwAbwBnACcA

P.S。

crb 建议使用“cmd / c”。但在这种情况下,编码的脚本长度将受command line limitations

的约束
  

在运行Microsoft Windows的计算机上   XP或更高版本,最大长度   您可以在命令中使用的字符串   提示符是8191个字符。上   运行Microsoft Windows的计算机   2000或Windows NT 4.0,最大值   您可以使用的字符串的长度   在命令提示符是2047年   字符。