【问题标题】:Tee-Object -Variable not sending to stdoutTee-Object - 变量不发送到标准输出
【发布时间】:2017-11-28 02:55:56
【问题描述】:

我有一段脚本如下:

myBinary.exe --param1 a -param2 b | Tee-Object -Variable "myVar"

它曾经很好地流式传输输出。现在我将这一行移到了一个函数中,它不再流式传输到标准输出,而只填充变量 myVar

知道如何解决这个问题吗?

【问题讨论】:

  • 请允许我给你一个标准的建议给新手:如果一个答案解决了你的问题,请点击它旁边的大复选标记 (✓) 接受它,也可以选择给它投票(up - 投票需要 15 个或更多声望点)。如果您发现其他答案有帮助,请给他们投票。接受(您将获得 2 个声望点)和投票可以帮助未来的读者。请参阅the relevant help-center article。如果您的问题尚未得到完全解答,请提供反馈或self-answer

标签: powershell tee


【解决方案1】:

我们没有足够的信息来诊断您的问题,但有一个Tee-Object 陷阱可能可以解释您的症状:

从 Windows PowerShell v5.1 / PowerShell Core v6.0.0-rc 开始:

如果Tee-Object 没有通过管道接收到任何成功输出,它会保持目标变量的先前值不变,或者,如果没有该名称的预先存在的变量,没有创建它。

# Run command that produces stdout and therefore PS success-stream output.
cmd /c 'echo hi' | Tee-Object -Variable myVar

# Stdout -> success output was correctly captured in $myVar.
$myVar  # -> 'hi'

# Run another command that *doesn't* produce any stdout output
# (only stderr output).
cmd /c 'echo NO >&2' | Tee-Object -Variable myVar

# !! Perhaps unexpectedly, the previous value of $myVar was NOT cleared.
$myVar # -> !! STILL 'hi'

这种不直观的行为是reported on GitHub

- 繁琐 - 解决方法是先将目标变量显式设置为$null
$myVar = $null


因此,您在 $myVar 中看到的可能是一个 预先存在 的值,现在看似非标准输出输出 - myBinary.exe ... | Tee-Object ... 调用并不清楚。 p>

【讨论】:

  • 感谢您的快速回复。我已经隔离了这个问题,似乎只有当Tee-Object 在函数中时才会出现问题
  • @user1763590:问题可能还是一样;请注意,函数会看到在 ancestral 范围内定义的变量,因此如果在 global 范围内有 $myVar,例如,该函数也会看到它,并且带有不产生标准输出 / 成功输出的命令,Tee-Object 调用将创建一个覆盖祖先副本的本地副本。
  • 我知道这是旧的,但问题仍然存在;有解决方法吗?将标准错误重定向到标准输出?在我的情况下,我正在调用一个 git push 命令,我认为只会导致 stderr 输出(根本不直观),所以我看到了同样的问题。
  • @kamranicus, - 麻烦 - 解决方法是首先将目标变量显式设置为$null
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多