gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 00:16:16 26 4
gpt4 key购买 nike

我有一个文件夹,其中包含大量文件,具有许多不同的扩展名(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(filename6.jkl,filename7.mno,filename9.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:\Temp\FileCompareTest\"

$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"
}
}
}
}
}

你能帮忙吗?

问候

达伦

最佳答案

感谢您包含您的代码。您有比较名称和扩展名的正确想法,但可以尝试其他方法。

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

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

$path = "C:\temp\test"
$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查看循环中的文件是否在列表中有其伙伴。如果不是,它通过管道。

关于powershell - 听起来很复杂,但事实并非如此,在PowerShell中比较文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34147673/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com