【问题标题】:PowerShell use xcopy, robocopy or copy-item [closed]PowerShell 使用 xcopy、robocopy 或 copy-item [关闭]
【发布时间】:2015-02-04 03:28:25
【问题描述】:

从批处理文件切换到 powershell 脚本的原因是为了改进进程的错误检查。用于复制的cmdlet在这方面有优势吗?

如果已经存在使用 xcopy 按文件名单独复制文件的批处理文件,将语法转换为复制项有什么好处吗?

使用 robocopy、xcopy 和 copy-item 有什么优势(相互比较)?例如,robocopy 在通过可靠网络处理大量小文件时是否具有优势。如果此脚本要在数百台计算机上同时运行以将数百个文件复制到每个计算机上,这会影响决策吗?决策是否应该主要关注文件的权限?

【问题讨论】:

  • 完全取决于你想做什么。您在列表中错过了 Robocopy。
  • 这太宽泛了。我们不知道你在移动什么,移动了多少。有很多不同之处,您几乎总是希望在批处理作业的基本复制项上使用 xcopy/robocopy。
  • 虽然标题含糊不清,但帖子显然是在询问他是否应该将现有批处理文件中的 xcopy <source> <dest> <options> 转换为 PS 本机 Copy-Item cmdlet,或者保持原样。我们确实需要更多信息,但我觉得 cmets 和反对票对此过于苛刻。
  • 问题已编辑。考虑到我的问题的措辞方式,“完全取决于你想做什么”是公平的。但问题的重点是找出它依赖于什么。

标签: powershell xcopy copy-item


【解决方案1】:

主要优点是您可以通过管道而不是字符串或文件规范将对象发送到Copy-Item。所以你可以这样做:

Get-ChildItem '\\fileserver\photos\*.jpeg' -File | `
  Where-Object { ($_.LastAccessTime -ge (Get-Date).AddDays(-1)) -and ($_.Length -le 500000) } | `
  Copy-Item -Destination '\\webserver\photos\'

这是一个糟糕的例子(你可以用Copy-Item -Filter 做到这一点),但它很容易即时提出。在处理文件时以来自Get-ChildItem 的管道结束是很常见的,我个人倾向于这样做只是因为-Recurse -IncludeRemove-Item 的错误。

您还可以获得 PowerShell 的错误捕获、-Passthru-WhatIf-UseTransaction 等特殊参数以及所有常用参数。 Copy-Item -Recurse 可以复制 xcopy 的一些树复制能力,但它非常简单。

现在,如果您需要维护 ACL、所有权、审计等,那么 xcopyrobocopy 可能会容易得多,因为该功能是内置的。我不确定 @987654334 如何@ 处理将加密文件复制到非加密位置(xcopy 有一定的能力这样做),我不相信Copy-Item 支持直接管理存档属性。

如果您正在寻找速度,那么我怀疑 xcopy 和 robocopy 会胜出。托管代码通常具有更高的开销。 Xcopy 和 robocopy 还可以更好地控制它们与网络的工作情况。

【讨论】:

  • 我最终采用的解决方案是读取要从文本文件复制的文件列表并将它们通过管道传输到 Copy-Item。这种方法的工作原理非常一致,即使将它们传递给我的自定义函数以进行任何操作(例如注册 DLL)。
  • Remove-item 的错误仍未修复,即使在 Posh v5 中也是如此。 MS 网站说:“当它与 Include 参数一起使用时,Recurse 参数可能不会删除所有子目录或所有子项。这是一个已知问题;作为一种解决方法,尝试将 Get-ChildItem -Recurse cmdlet 的结果通过管道传输到Remove-Item cmdlet,如本主题的示例 4 中所述”。 technet.microsoft.com/en-us/library/hh849765.aspx
猜你喜欢
  • 2019-09-01
  • 2016-07-11
  • 1970-01-01
  • 1970-01-01
  • 2014-07-14
  • 1970-01-01
  • 2012-12-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多