我有两个具有相同目录结构的磁盘。 C:\Files
和D:\Files
C:\Files
和D:\Files
都有多个目录,但名称相同,但其中的文件扩展名不同。在C:\Files
*.csv
D:\Files
和C:\
中,进程监视文件(从*.processed
复制),一旦完成,将文件更改为C:\Files
。
我想要一个可以复制的脚本。即将文件从D:\Files
复制到{{1}},但尚未通过仅比较文件名进行处理。
答案 0 :(得分:2)
你想要这样的东西。您要比较的属性称为BaseName
,其中powershell帮助您添加到IO.FileSystemInfo
类(FileInfo.BaseName exists in PowerShell but not in straight .NET)。 BaseName
只是文件的名称,并且不包含您不关心的任何扩展程序。
$sourceFiles = Get-ChildItem C:\files -Recurse -File -Filter "*.csv"
$destinationFiles = Get-ChildItem D:\files -Recurse -File
foreach($sourceFile in $sourceFiles) {
$exists = $destinationFiles | Where-Object {$_.BaseName -eq $sourceFile.BaseName}
if(!$exists) {
Copy-Item $sourceFile.fullname -Destination "D:\Files\$($sourceFile.BaseName)"
}
}
答案 1 :(得分:0)
dir .\ *csv -Recurse -File | cp -ea Ignore -WhatIf -Destination {
$dest=$_.FullName-replace'^C:','D:'-replace'\.csv','.processed'
if(Test-Path $dest){
Write-Host Already exists -ForegroundColor Yellow
$null
}else{
Write-Host Copying... -ForegroundColor Green
$dest-replace'\.processed$','.csv'
}
}
注意WhatIf参数:如果您要真正复制项目,则必须将其删除。
此外,您可能希望使用write-host
cmdlet删除2行。
另请注意,我已将C:
和D:
驱动器硬编码为源驱动器和目标驱动器。