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

仅基于文件名比较两个目录的Powershell脚本,powershell,Powershell,我有两个具有相同目录结构的磁盘C:\Files和D:\Files C:\Files和D:\Files下都有多个目录,但名称相同,等等,但其中的文件扩展名不同。在C:\文件中,它们是*.csv和D:\文件中,进程监视文件(从C:\复制),完成后将文件更改为*.processed 我想要一个可以复制的脚本。也就是说,将文件从C:\files复制到D:\files,这些文件没有通过仅比较文件名进行处理。您想要这样的内容。要对其进行比较的属性名为BaseName,powershell会帮助您将该属性添加

我有两个具有相同目录结构的磁盘<代码>C:\Files和
D:\Files

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


我想要一个可以复制的脚本。也就是说,将文件从
C:\files
复制到
D:\files
,这些文件没有通过仅比较文件名进行处理。

您想要这样的内容。要对其进行比较的属性名为
BaseName
,powershell会帮助您将该属性添加到
IO.FileSystemInfo
类()
BaseName
只是文件名,不包含任何您不关心的扩展名

$sourceFiles=Get ChildItem C:\files-Recurse-File-Filter“*.csv”
$destinationFiles=获取子项D:\files-Recurse-File
foreach($sourceFiles中的sourceFile){
$exists=$destinationFiles |其中对象{$\.BaseName-eq$sourceFile.BaseName}
如果(!$存在){
复制项目$sourceFile.fullname-目标“D:\Files\$($sourceFile.BaseName)”
}
}
请注意WhatIf参数:如果要真正复制项目,必须将其删除。 此外,您可能希望使用
write-host
cmdlet删除这两行。 也不必担心,我已经将
C:
D:
驱动器硬编码为源驱动器和目标驱动器

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'
    }
}