我有一个运行良好的功能。它将zip文件解压缩到目标文件夹中。如果目标文件夹中包含文件,它将被新的提取文件覆盖。现在,我想在提取zip文件之前删除/删除一个大小为12G的文件(bigfile.txt)。我该怎么做。有人可以帮我吗?下面是功能。谢谢
function Unzip($zipfile, $outdir)
{
Add-Type -AssemblyName System.IO.Compression.FileSystem
$archive = [System.IO.Compression.ZipFile]::OpenRead($zipfile)
foreach ($entry in $archive.Entries)
{
$entryTargetFilePath = [System.IO.Path]::Combine($outdir, $entry.FullName)
$entryDir = [System.IO.Path]::GetDirectoryName($entryTargetFilePath)
#Ensure the directory of the archive entry exists
if(!(Test-Path $entryDir )){
New-Item -ItemType Directory -Path $entryDir | Out-Null
}
#If the entry is not a directory entry, then extract entry
if(!$entryTargetFilePath.EndsWith("\")){
[System.IO.Compression.ZipFileExtensions]::ExtractToFile($entry, $entryTargetFilePath, $true);
}
Unzip -zipfile "c:\temp\filezip_1.zip" -outdir "c:\folder_1\extracted_files"
Unzip -zipfile "c:\temp\filezip_2.zip" -outdir "c:\folder_2\extracted_files"e
答案 0 :(得分:0)
您仅显示从zip文件中获取的解压缩/解压缩,而不是删除您需要的内容。
您所要的东西似乎与本讨论和答案重复 。
Remove files from .zip file with Powershell
您还已经在调用System.IO.Compression命名空间,因此System.IO.Compression.Filesystem具有更新和删除方法。
示例:(忽略/删除暂停-它就在那儿,以便每个阶段都可以看到结果。)
# Zip file path
$zip = 'D:\Temp\MyFile.zip'
# Instantiate the .Net namespace
add-type -AssemblyName 'System.IO.Compression.filesystem'
# Remove a file from a zip archive
foreach ($z in $zip)
{
# Open the zip for updating
$tempz = [io.compression.zipfile]::Open($z,'Update')
"`nShow all files in the zip"
$tempz.Entries
Pause
"`nDelete a specific file"
($tempz.Entries | Where FullName -Match 'Test.clixml').Delete()
Pause
"`nValidate remove"
$tempz.Entries
Pause
# Clean up / close the zip
$tempz.Dispose()
}
Show all files in the zip
Archive : System.IO.Compression.ZipArchive
CompressedLength : 69
ExternalAttributes : 32
FullName : newfile.txt
LastWriteTime : 30-Sep-18 20:52:08 -07:00
Length : 116
Name : newfile.txt
Archive : System.IO.Compression.ZipArchive
CompressedLength : 41438
ExternalAttributes : 32
FullName : ps-gps.xml
LastWriteTime : 02-Oct-18 19:29:44 -07:00
Length : 767464
Name : ps-gps.xml
Archive : System.IO.Compression.ZipArchive
CompressedLength : 45
ExternalAttributes : 32
FullName : MyFile.txt
LastWriteTime : 30-Sep-18 23:31:08 -07:00
Length : 55
Name : MyFile.txt
Archive : System.IO.Compression.ZipArchive
CompressedLength : 132
ExternalAttributes : 32
FullName : Test.clixml
LastWriteTime : 02-Oct-18 17:26:00 -07:00
Length : 202
Name : Test.clixml
Press Enter to continue...:
Delete a specific file
Press Enter to continue...:
Validate remove
Archive : System.IO.Compression.ZipArchive
CompressedLength : 69
ExternalAttributes : 32
FullName : newfile.txt
LastWriteTime : 30-Sep-18 20:52:08 -07:00
Length : 116
Name : newfile.txt
Archive : System.IO.Compression.ZipArchive
CompressedLength : 41438
ExternalAttributes : 32
FullName : ps-gps.xml
LastWriteTime : 02-Oct-18 19:29:44 -07:00
Length : 767464
Name : ps-gps.xml
Archive : System.IO.Compression.ZipArchive
CompressedLength : 45
ExternalAttributes : 32
FullName : MyFile.txt
LastWriteTime : 30-Sep-18 23:31:08 -07:00
Length : 55
Name : MyFile.txt
Press Enter to continue...:
根据OP请求进行更新/多个文件和代码合并
您可能需要处理的zip文件数量确实不是问题。 通过尽可能多的。
您没有说的是,您如何获得这些zip文件名。含义通过 Get-ChildItem或从某些文本文件中,使用相同的cmdlet搜索它们。
两种方法都相同。
如果我直接检查您的功能,请在此过程中修复一些问题。 试试这个...
function Expand-ZipFilesWithCleanUp
{
[cmdletbinding()]
[Alias('ezc')]
Param
(
[string[]]$ZipFiles,
[string]$Outdir,
[string] $FilenameToRemove
)
# Instantiate the .Net namespace
add-type -AssemblyName 'System.IO.Compression.filesystem'
"The number of zip files passed in was $($ZipFiles.Count)"
# Remove unwanted files
foreach ($ZipFile in $ZipFiles)
{
# Open the zip for updating
$ProcessZipFile = [io.compression.zipfile]::Open($ZipFile,'Update')
"`nShow all files in the zip"
$ProcessZipFile.Entries | Out-GridView -PassThru
"`nDeleting unwanted file $FilenameToRemove from $ZipFile"
($ProcessZipFile.Entries | Where FullName -Match $FilenameToRemove).Delete()
"`nValidate remove"
$ProcessZipFile.Entries | Out-GridView -PassThru
# Clean up / close the zip
$ProcessZipFile.Dispose()
}
#//Begin unzip code
#//End unzip code
}
Expand-ZipFilesWithCleanUp -ZipFiles (Get-ChildItem -Path 'D:\Temp' -Filter '*.zip').FullName -FilenameToRemove 'Test.clixml'
再次,那些..
$ProcessZipFile.Entries | Out-GridView -PassThru
…不需要行,它们只是弹出对话框以向您显示删除或给定文件之前和之后zip中发生的情况的一种方式。
您现在要做的就是在提供的空白处添加其他代码。