Powershell脚本,用于仅基于文件名比较两个目录

时间:2014-12-24 19:07:02

标签: powershell

我有两个具有相同目录结构的磁盘。 C:\FilesD:\Files

C:\FilesD:\Files都有多个目录,但名称相同,但其中的文件扩展名不同。在C:\Files *.csv D:\FilesC:\中,进程监视文件(从*.processed复制),一旦完成,将文件更改为C:\Files

我想要一个可以复制的脚本。即将文件从D:\Files复制到{{1}},但尚未通过仅比较文件名进行处理。

2 个答案:

答案 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:驱动器硬编码为源驱动器和目标驱动器。