这听起来很复杂,但事实并非如此,在PowerShell中比较文件



我有一个文件夹,里面有大量的文件,有很多不同的扩展名(abc、abc_trg、def、def_trg、ghi、ghi_trg、jkl、mno)。你会看到有些文件有一个匹配的"触发器"文件,但并不是这个文件夹中的所有文件都需要有触发器文件,只是以下扩展名必须有触发器文件:abc、def、ghi。

filename1.abc
filename1.abc_trg
filename2.def
filename2.def_trg
filename3.abc
filename4.def_trg
filename5.ghi
filename6.jkl
filename7.mno
filename8.ghi
filename8.ghi_trg
filename9.jkl

即,具有触发器文件的扩展类型(abc、abc_trg、def、def_trg、ghi、ghi_trg)必须具有匹配的文件名。

我需要一个PowerShell脚本,它将分析并比较本应与触发器文件类型(abc、abc_trg、def、def_trg、ghi、ghi_trg)存在的文件,以及是否找到匹配(例如filename1、filename2、filename8),或者是否有扩展名不在此列表中的文件,例如jkl&mno(文件名6.jkl、文件名7.mno、文件名9.jkl),则这些文件被保留/不被触摸。

如果存在旨在具有匹配扩展名&触发文件,但没有,即它们已成为孤立文件,则需要删除这些文件(例如filename3.abc、filename4.def_trg、filename5.ghi)

因此生成的文件列表应该如下所示:

filename1.abc
filename1.abc_trg
filename2.def
filename2.def_trg
filename6.jkl
filename7.mno
filename8.ghi
filename8.ghi_trg
filename9.jkl

这是我到目前为止的代码:

$strDir = "D:TempFileCompareTest"
$strFileTypesToIgnore = ".jkl",".mno"
$strExtABC = ".abc"
$strExtABC_Trigger = ".abc_trg"
$strExtDEF = ".def"
$strExtDEF_Trigger = ".def_trg"
$strExtGHI = ".ghi"
$strExtGHI_Trigger = ".ghi_trg"
$arrFiles = Get-ChildItem $strDir -exclude $strFileTypesToIgnore
ForEach ($objFile in $arrFiles) {
    $strFilename = $objFile.BaseName
    $strExtension = $objFile.Extension
    If ($strExtension -eq ".abc") {
        $arrFiles2 = Get-ChildItem $strDir -exclude $strFileTypesToIgnore
        ForEach ($objFile2 in $arrFiles2) {
            $strFilename2 = $objFile2.BaseName
            $strExtension2 = $objFile2.Extension
            If ($strExtension2 -eq ".abc_trg") {
                If (Compare-Object $strFilename $strFilename2) {
                    Write-Host "match is: $strFilename$strExtension and $strFilename2$strExtension2"
                } Else {
                    Write-Host "Not a match: $strFilename$strExtension and $strFilename2$strExtension2"
                }
            }
        }
    }
} 

你能帮忙吗?

问候

Darren

感谢您的代码。您对比较名称和扩展名有正确的想法,但让我们尝试不同的方法。

我们循环每个文件并检查其扩展名。根据文件是否为trg文件,我们有类似的方法来检查其合作伙伴。由于我们使用了Where-Object子句,因此输出文件被传递到管道上Remove-Item以进行删除。使用-WhatIf开关进行测试,以验证其是否工作。

我尝试使用简单的cmdlet和方法进行字符串操作。

$path = "C:temptest"
$extension = "_trg"
$files = Get-ChildItem -Path $path
$fileNames = $files | Select-Object -ExpandProperty Name
$files | Where-Object{
    # Check what extension this file is so we can find the appropriate partner
    if($_.Extension.Contains($extension)){
        # Attempt to find a matching non trg file
        $fileNames -notcontains $_.Name.Substring(0, $_.Name.LastIndexOf($extension))
    } else {
        # Attempt to find a matching trg file
        $fileNames -notcontains "$($_.Name)$extension"
    }
} | Remove-Item -Force -Confirm:$false -WhatIf

我们将所有文件名保存在$fileNames中,并使用-notcontains查看循环中的文件是否在列表中有其伙伴。如果没有,它就会穿过管道。

最新更新