提问人:Ri Sch 提问时间:10/27/2023 最后编辑:Ri Sch 更新时间:11/10/2023 访问量:34
用于解压缩特定嵌套存档的脚本逻辑,而无需解压缩不必要的存档
Script logic to unzip specific, nested archive(s) without unzipping unnecessary archives
问:
首先我要说的是,我很高兴能拿回伪代码,我只是真的需要帮助来定义这个过程。
我在档案中得到了很多大文件。并非所有供应商都以相同的格式将它们发送给我。一些文件(cad、visio、excel 等)以单个 .zip 文件的形式发送。有些以 .rar 文件的形式发送。一些 .rar 文件包含 .zip 文件,反之亦然(旁注,我不知道为什么这些是双重存档的,但我在图腾柱上太低了,无法要求更改供应商格式或流程)。要扔一个扳手,zip 中通常也有一个 .txt 和/或 .dat 文件 - 有时它会在嵌套的 zip 中复制。我并不真正关心这些信息文件,但它们确实存在,所以我提到了它们。
最近,一些供应商现在也发送了 .r00 和 .r01 格式的文件。所以我必须解压缩文件夹中的基本 .rar 或 .r00,然后解压缩所有 .r01......R12 或其他任何东西也被解压缩。我有一个脚本,当它是 .zip 或 .rar 时处理得很好,我试图适应嵌套的 zip,但我正在挣扎。
给我带来特别麻烦的情况是当有一个没有 .rar 的 .r00 时,但我也刚刚找到了一个有 .rar 和一个 .r00 但脚本仅从 .r00 中提取(忽略 .rar),所以应该为 92 MB 的文件只有 76 MB 并且没有打开。
下面是一个示例项目文件夹和其中包含的供应商文件:
Project Lambda Folder
-- RFspan-2.zip
---- RFspan-2.dat
---- RFspan-2.info
---- RFspan-2.r00
---- RFspan-2.r01
---- RFspan-2.r02
---- RFspan-2.rar
------ RFspan-2.info
------ RFspan-2.vsdx
显然,这是我感兴趣的RFspan-2.vsdx。
为了帮助将脚本置于上下文中,手动过程如下:
- 在项目文件夹中接收存档文件
- 在上面的示例中标识基本存档 - RFspan-2.zip
- 提取基本存档
- 如果提取的文件也是存档,请提取它们 - 上面示例中的 RFspan-2.rar
- 请注意,基本存档已被提取,因此我不会再次提取它
- <处理提取的文件 - 此步骤没有编写脚本,因为它取决于文件是什么以及它属于哪个项目,但为了完整性,我将其包括在内
我的问题是:我怎样才能在不遗漏任何文件的情况下提取正确的文件,并且不解压缩重复文件?
我将此脚本设置为每天作为计划任务运行,并且通常每周检查一次或两次提取的文件。我希望它运行并提取正确的存档,并且每个文件夹只提取一个存档,除非该存档还包含一个存档,在这种情况下,它需要确定新的基本存档并提取该存档。
有关以下 PowerShell 代码的说明: New-Logline 是与 Transcript 函数一起使用的自定义函数 Test-RegMarker 和 New-RegMarker 是用于在 HKLM:\SOFTWARE\SupplierArchs 中读取和写入哈希值的自定义函数
$ExtractedSupplierFiles = 0
New-LogLine "Beginning first lookup and extraction"
write-host ""
# Write-Host ""
$SearchPatterns = "*.zip","*.rar", "*.r00", "*.r01"
$searchPaths = $SearchPatterns |% {Join-Path "D:\Repository\SupplierFiles\" -ChildPath $_ }
$targetarchives = (gci $searchPaths -Recurse | ? fullname -NotMatch '^D:\Repository\SupplierFiles\extracted') # |? FullName -like "*375*"
$BaseUnzippedFolder = "D:\Repository\SupplierFiles\Extracted\"
$UnzippedFolder = Join-Path $BaseUnzippedFolder $TodayDate
$7zipExe = "D:\Program Files\7-Zip\7z.exe"
$failed = [System.Collections.Generic.List[PSObject]]::new()
foreach ($targetzip in $targetarchives) {
write-host ""
$filehash = (Get-FileHash -literalpath $targetzip.fullname).hash
if (-not(Test-RegMarker -KeyName $filehash -Value $targetzip.basename )) {
if (& $7zipExe e $targetzip.fullname -o"$UnzippedFolder" -aoa -r) {
New-RegMarker -KeyName $filehash -Value $targetzip.basename
$ExtractedSupplierFiles++
}
else {$Failed.add($targetzip.fullname)}
} #close if not test regmarker
} #close foreach targetzip
Write-Host ""
If (Test-Path $UnzippedFolder) {
New-LogLine "+++++Setting Filedates for $UnzippedFolder"
gci $UnzippedFolder -file -Recurse | % {
$(Get-Item $_.FullName).creationtime = $(Get-Date)
$(Get-Item $_.FullName).lastaccesstime = $(Get-Date)
$(Get-Item $_.FullName).lastwritetime = $(Get-Date)
} # close get unzipped
} # close if test path
IF ($host.name -eq 'Windows Powershell ISE Host') {$Continue = read-host "[INPUT REQUIRED] Continue checking destination for nested zips? Answer True or False, alternatively 1 for yes or 0 for no"}
else {$Continue = $true ; New-LogLine "Running scheduled, not in ISE so monitoring the new ones, too"}
Write-Host ""
if ( ($Continue -eq $true) -or ($Continue -eq 1)) {
$SearchPatterns = "*.zip","*.rar", "*.r00", "*.r01"
$unzipfolpath = $SearchPatterns |% {Join-Path $UnzippedFolder -ChildPath $_ }
$unzipArchs = gci $unzipfolpath -Recurse
Write-Host ""
New-LogLine "Found $($unzipArchs.Count) extracted or nested zips"
Write-Host ""
foreach ($targetzip in $unzipArchs) {
$filehash = (Get-FileHash -literalpath $targetzip.fullname).hash
if (-not(Test-RegMarker -KeyName $filehash -Value $targetzip.basename )) {
if (& $7zipExe e $targetzip.fullname -o"$UnzippedFolder" -aoa -r) { New-RegMarker -KeyName $filehash -Value $targetzip.basename ; $ExtractedSupplierFiles++ }
else { $Failed.add($targetzip.fullname) }
} #close if not test regmarker
} #close foreach targetzip
} # close if continue eq true
这里有一些伪代码,我认为可能有效,但感觉这可能不正确:
foreach targetzip
gci psparentpath
if filename with .zip
get file hash
if not regmarker
7zip .zip file
elseif filename with .rar
get file hash
if not regmarker
7zip .rar file
elseif filename with .r00
get file hash
if not regmarker
7zip .r00 file
elseif filename with .r01
get file hash
if not regmarker
7zip .r01 file
我希望这是有道理的......
答: 暂无答案
评论