【问题标题】:Powershell piping to variable and write-host at the same timePowershell同时管道到变量和写入主机
【发布时间】:2015-08-08 23:58:39
【问题描述】:

大家好,提前感谢您的宝贵时间;

我遇到了一个小问题。

我正在运行一个命令并将其传送到一个变量中,以便我可以操纵输出。

$variable = some command

这通常可以正常工作,但不会将正在发生的事情输出到屏幕上,这在大多数情况下都很好。然而,有时这个命令需要一些用户输入(例如是或否或跳过),并且由于它实际上并没有将任何东西传递到命令窗口,它只是挂在那里而不是提示用户。如果您知道会发生什么,您可以点击 y 或 n 或 s,它会正常进行。

是否有运行命令以将输出通过管道传输到变量并出现在屏幕上?我已经试过了:

($variable = some command) 

我也试过了:

write-host ($variable = some command) 

但两者都不起作用。请注意,运行的命令不是本机 windows 或 shell 命令,我不能连续运行两次。

澄清(因为我可能不清楚)

我也试过了:

$variable = some command : Out-host

$variable = some command | out-default

及其所有参数,但命令中的“提示”(写 y、n、s)没有显示。

能够自动通过 S 也是可以接受的。

【问题讨论】:

    标签: variables powershell output write-host


    【解决方案1】:

    听起来你需要Tee-Object。示例:

    some command | Tee-Object -Variable MyVariable
    

    这应该将命令中的所有内容传递到管道中,并将命令的所有输出存储在 $MyVariable 变量中。

    【讨论】:

    • 感谢您的回复,不幸的是,这也不起作用。如果我完全按照您所说的那样做,它会报告“无法绑定到参数,因为它为空。如果我()命令,它会执行与以前相同的行为(无提示),即使它实际上正在正确运行命令。编辑: 我尝试使用 false 值预先设置变量,它确实被命令输出覆盖,但提示仍然不显示。
    【解决方案2】:

    您需要给出一些不起作用的具体示例。我试过了,它有效:

    function test { $c = read-host "Say something"; $c }
    $x = test
    

    我仍然看到“说点什么”。 read-host 不输出到标准输出,所以您的问题令人惊讶。即使这样也有效:

    read-host "Say something" *> out
    

    === 编辑 ===

    由于这是与 cmd.exe 的交互,因此您有两个选项 AFAIK。一、测试命令:

    test.cmd

    @echo off
    set /p something="Say something: "
    echo %something%
    

    这不像你说的那样工作:$x= ./test.cmd

    为了让它发挥作用:

    a) 将上述命令替换为:"Say something:"; $x= ./test.cmd。这在一般情况下显然并不理想,因为您可能事先不知道 *.cmd 会问什么。但是当你知道它很容易。

    b)试试这个:

    Start-transcript test_out; 
    ./test.cmd; 
    Stop-transcript;
    gc .\test_out | sls 'test.cmd' -Context 0,1 | select -Last 1 | set y
    rm test_out 
    $z = ($y -split "`n").Trim()
    

    在此$z 变量之后包含:Say something: something。这可能是一个很好的通用解决方案,您可以将其转换为函数:

    $z = Get-CmdOutput test.cmd
    

    在一般情况下,文本解析的细节可能会略有不同 - 我在这里假设只提出 1 个问题并且答案在同一行,但无论如何通过一些工作,您将能够获得所有 cmd.exe 脚本输出一般情况:

    === 编辑 2 ===

    这可能是一个更好的通用提取:

    $a = gi test_out; rm test_out
    $z = $a | select -Index 14,($a.count-5)
    $z
    

    【讨论】:

    • 该命令是来自我们公司基线工具的 .cmd 命令。问题不是常规输出,问题是当有一个基本上说“是,否,编辑,跳过”的提示时,如果我将命令传递给变量,则该提示不会出现,如果我从powershell触发它而不用管道它。所以基本上我想模仿调用它而不是管道它的行为,但同时管道它。和三通和 | out-host 或 |out-default 不起作用。我不在乎提示是否添加到变量中,我只需要它显示在命令行窗口上。
    【解决方案3】:
    $variable = ""
    some command | % {$variable += $_;"$_"}
    

    这会执行命令,并且每行输出都会添加到 $variable 并打印到控制台。

    【讨论】:

      猜你喜欢
      • 2011-11-04
      • 2021-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多