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