【问题标题】:Can't redirect PowerShell output when -EncodedCommand used使用 -EncodedCommand 时无法重定向 PowerShell 输出
【发布时间】:2010-10-18 09:45:04
【问题描述】:

对于我的测试,我使用的是“开始 > 运行”对话框(不是 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)
}

【问题讨论】:

    标签: powershell output-redirect


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 我在解释为​​什么会这样。我相信重要的是不仅要修复代码中的错误,还要了解它们发生的原因。有时它甚至可以向您展示解决其他问题的巧妙方法。
    【解决方案2】:

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

    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
    

    附言

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

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

    【讨论】:

      【解决方案3】:

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

      无论如何,这是可行的,但代价是产生了一个原本无用的控制台:

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

      【讨论】:

      • 啊.. 确实,> 只是一个 PowerShell 运算符。
      猜你喜欢
      • 2014-01-05
      • 2011-09-11
      • 2022-11-30
      • 2015-06-22
      • 1970-01-01
      • 1970-01-01
      • 2017-09-02
      • 2012-12-13
      • 1970-01-01
      相关资源
      最近更新 更多