首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >相当于cp -n的Powershell,即复制文件而不覆盖

相当于cp -n的Powershell,即复制文件而不覆盖
EN

Stack Overflow用户
提问于 2016-03-12 16:10:38
回答 1查看 1.6K关注 0票数 2

我经常需要在驱动器之间复制大量文件,这个过程经常会启动和停止。在我可以使用的posix shell中

不覆盖现有文件,但似乎没有等效的“不覆盖”开关

在powershell中。

这意味着如果我必须停止和启动进程,我必须使用

代码语言:javascript
运行
复制
ls -Recurse|%{
    if (-Not(test-path($_fullname.replace("D:\", "E:\")))){
        cp $_.fullname $_.fullname.replace("D:\", "E:\");
    }
}

工作得很好,但是如果我有一百万个文件要复制,我会认为必须执行一些开销

每次都是。

编辑:顺便说一句,我试过了

,但是扫描已经存在的文件需要花费很长时间。如果我使用上面的脚本,并且我正在进行一个大会话的一半,那么在它开始复制新文件之前会有几秒钟的停顿;使用robocopy时,它甚至在开始复制之前就已经花了几分钟的时间来运行已经复制的文件。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-12 18:39:28

另一种方法是使用

这将在目标存在时抛出一个异常,但随后您必须处理异常处理+创建目录的开销,因此它肯定不会有太大帮助。

您可以使用.NET

方法直接减少路径测试中的powershell开销(2/3)。我没有包装

在函数中添加-calls,因为这会增加powershell开销。

代码语言:javascript
运行
复制
#Avoid aliases in scripts. You want people to be able to read it later
Get-ChildItem -Recurse| ForEach-Object {
    if (-Not([System.IO.File]::Exists($_fullname.replace("D:\", "E:\")) -or [System.IO.Directory]::Exists($_fullname.replace("D:\", "E:\")))){
        Copy-Item -Path $_.fullname -Destination $_.fullname.replace("D:\", "E:\")
    }
}

比较:

代码语言:javascript
运行
复制
Measure-Command { 1..100000 | % { [System.IO.File]::Exists("C:\users\frode") -or [System.IO.Directory]::Exists("C:\users\frode") } } | Select-Object -ExpandProperty totalseconds

6,7130002

Measure-Command { 1..100000 | % { Test-Path "C:\users\frode" } } | Select-Object -ExpandProperty totalseconds

22,4492812
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35955289

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档