powershell - 如何在运行时在 powershell 脚本中显示 xcopy 的输出

标签 powershell xcopy

我有这个 powershell 脚本,我想将文件从生产服务器复制到测试服务器,并且只复制更新或更改的文件。 脚本本身有更多的功能,但这个复制就是其中之一。 为此,我正在使用以下 XCopy 命令:

  ... some other scriptingcode
  try {
      xCopy $source $destination /f /e /r /k /y /d
  }
  catch {
      Write-Host "issue: $PSItem" -ForegroundColor Yellow -BackgroundColor Red
  }
  ... some more other scriptingcode

当我直接从 powershell 提示符运行 XCopy 命令时,它会在运行时显示它的进度、正在复制的文件,但是当我从脚本本身运行它时,它不会输出任何事物。在末尾添加 -Verbose 只会给我一个脚本错误。

我尝试了以下方法:

  $output = $(xCopy $source $destination /f /e /r /k /y /d) -join "`r\`n"
  Write-Host $output

但这只会在它已经被复制后给我输出,当没有复制 1 或 2 个文件时这不是问题,但当你有 100 或 1.000 个文件要复制时,它并没有真正的帮助。仅供引用, -join "'r'n" 是因为当输出多行时输出是一个数组,所以我必须将这些行连接成一个字符串,该字符串可以由 写主机.

我试图用谷歌搜索解决方案,但我想我的谷歌技能不足以让我对这个问题有任何结果。 那么,有没有办法让 XCopy 输出,就像直接从 powershell 命令行一样?

最佳答案

不应该看到脚本有问题,因为默认情况下,PowerShell 会传递来自外部程序的 stdout 和 stderr 输出例如 xcopy.exe 直接通过主机(控制台),而不会干扰输出或其时序 - 无论您是交互式执行程序还是来自脚本。

同样,如果您通过管道发送标准输出(成功)输出,PowerShell 流式传输它,即按原样发送每个输出行收到(可以想象,一个给定的程序在不打印到控制台时可能会在发出它们之前自己缓冲行,但对于 xcopy.exe 似乎不是这种情况)。

流方式将外部程序的输出打印到控制台同时捕获其输出的最简单方法是使用 Tee-Object cmdlet :

# Prints the output to the console as it is being received
# while also capturing it in variable $output
xcopy $source $destination /f /e /r /k /y /d | Tee-Object -Variable output

之后,$output 将 stdout 输出包含为 行数组(或单个字符串,如果恰好只有 < em>一个输出线)。

要同时捕获 stderr 输出,请将 redirection 2>&1 附加到外部程序调用; stderr 行被捕获为 System.Management.Automation.ErrorRecord 实例,就好像它们是 PowerShell 错误一样;之后要将所有数组元素转换为 strings,请使用 $output = [string[]] $output

字符编码说明:当 PowerShell 涉及处理外部程序输出(在管道中、在变量中捕获、保存到文件)时,输出总是解码为 . NET 字符串优先,基于存储在 [Console]::OutputEncoding 中的编码,可能需要根据情况进行修改以匹配给定外部程序使用的特定编码 - 请参阅 this answer更多信息。

如果您想对从外部程序接收到的行执行转换或应用额外的格式,请考虑基于 Cpt.Whale's helpful solutionForEach-Object

关于powershell - 如何在运行时在 powershell 脚本中显示 xcopy 的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69711932/

相关文章:

json - 如何使用PowerShell从JSON响应中获取单个值

powershell - 以表格格式将 Azure 自动化输出发送到应用程序洞察

windows - False 'Sharing Violation' Xcopy 错误信息

PowerShell 内联 If (IIf)

windows - 如何使用 Powershell 编辑快捷方式中的 Target 属性以在文件路径后包含一个字符?

msbuild - 使用xcopy将文件从多个目录复制到一个目录

batch-file - 在循环中使用 'move' 命令而不是 'xcopy'

xcopy - 如何使用 xcopy 在目标文件中添加日期?

windows - 将小的 PS 脚本转换为 .BATch 文件中的长行

batch-file - 从多个目录复制具有特定扩展名的文件