我需要将所有*.doc
文件(但不是名称与*.doc
匹配的文件夹)从网络文件夹\\server\source
(包括所有嵌套文件夹中的文件)复制到本地文件夹C:\destination
,而不保留嵌套文件夹层次结构(即所有文件应直接进入C:\destination
,不应在C:\destination
中创建嵌套文件夹)。如果在\\server\source
的不同子文件夹中有几个同名的文件,那么只应该复制第一个文件,然后再不要覆盖--以后发现的所有冲突文件都应该被跳过(可能有很多这样的情况,跳过的文件不应该在网络上传输,否则会花费太多的时间)。下面是我在PowerShell中实现它的尝试:
cp \\server\source\* -Recurse -Include *.doc -Container:$false -Destination C:\destination
这个命令至少有两个问题:
*.doc
匹配的文件夹。你能建议如何解决这些问题吗?
使用copy
、xcopy
、robocopy
、cscript
或*.bat
、*.cmd
实现也是受欢迎的。
本地操作系统是Windows 8,文件系统是NTFS。
发布于 2013-07-05 23:10:52
我将首先生成文件列表,并在您浏览该列表时进行验证。
就像这样:
$srcdir = "\\server\source\";
$destdir = "C:\destination\";
$files = (Get-ChildItem $SrcDir -recurse -filter *.doc | where-object {-not ($_.PSIsContainer)});
$files|foreach($_){
if (!([system.io.file]::Exists($destdir+$_.name))){
cp $_.Fullname ($destdir+$_.name)
};
}
因此,使用Get-ChildItem
列出与筛选器匹配的源文件夹中的文件,通过管道通过where-object
删除目录。
然后遍历foreach
循环中的每个文件,并使用system.io.file
.NET类的Exists
方法检查目标中是否存在文件名(而不是Fullname)。
如果没有,复制,只使用原始文件名(删除原始路径)。
在测试时,在副本上使用-whatif
选项,因此它只显示它将做什么,以防结果不是您想要的:-)
发布于 2013-07-09 18:32:42
以前的答案对我来说似乎太复杂了,除非我误解了什么。这应该是可行的:
Get-ChildItem "\\server\source\" *.doc -Recurse | ?{-not ($_.PSIsContainer -or (Test-Path "C:\Destination\$_"))} | Copy-Item -Destination "C:\Destination"
没有任何内置命令--复制、复制或机器人复制--都不会自己做您想做的事情,但是有一个名为xxcopy的实用工具可以方便地在http://www.xxcopy.com上使用。它有许多内置选项,专门用于将目录树扁平为单个目录。以下内容将如你所述:
xxcopy "\\server\source\*.doc" "C:\Destination" /SGFO
但是,除了复制第一个遇到的文件名之外,xxcopy还有其他各种处理重复文件名的选项,例如将源目录名称添加到文件名,或者向除第一个文件名以外的所有文件名添加顺序数字标识,或者添加除最新或最旧文件名以外的所有文件名。有关详细信息,请参阅此页面:http://www.xxcopy.com/xxcopy16.htm
发布于 2013-07-09 08:04:31
# Get all *.doc files under \\server\source
Get-ChildItem -Path \\server\source *.doc -Recurse |
# Filter out directores
Where-Object { -not $_.PsIsContainer } |
# Add property for destination
Add-Member ScriptProperty -Name Destination -Value { Join-Path 'C:\destination' $this.Name } -PassThru |
# Filter out files that exist on the destination
Where-Object { -not (Test-Path -Path $_.Destination -PathType Leaf } |
# Copy.
Copy-Item
https://stackoverflow.com/questions/17497667
复制相似问题