Powershell - 展开存档并重命名文件,因为它包含无效字符
Posted
技术标签:
【中文标题】Powershell - 展开存档并重命名文件,因为它包含无效字符【英文标题】:Powershell - Expand-Archive and rename files as it includes invalid characters 【发布时间】:2020-04-16 15:14:03 【问题描述】:我在使用 powershell 解压缩档案时遇到问题。
假设我已经下载了file.zip
file.zip
的文件名中带有“冒号”。 (即foo:bar.p12
)
使用 7zip 手动解压缩这些文件会自动将冒号 (:
) 替换为下划线 (_
)。工作正常!
将 expand-archive 与 powershell 一起使用会引发以下错误:
> New-Object : Exception calling ".ctor" with "1" argument(s): "The
> given path's format is not supported." At
> C:\Windows\system32\WindowsPowerShell\v1.0\Modules\Microsoft.PowerShell.Archive\Microsoft.PowerShell.Archive.psm1:1004
> char:52
> + ... yFileInfo = New-Object -TypeName System.IO.FileInfo -ArgumentList $cu ...
> + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> + CategoryInfo : InvalidOperation: (:) [New-Object], MethodInvocationException
> + FullyQualifiedErrorId : ConstructorInvokedThrowException,Microsoft.PowerShell.Commands.NewObjectCommand
这是我的代码:
$zip_location = "C:\path\to\zipfiles"
$zipfiles = Get-ChildItem $zip_location -Filter *.zip
foreach ($zip in $zipfiles)
Expand-Archive -Path $zip_location\$zip -DestinationPath $zip_location -Force
有没有办法用 powershell 提取这些文件?谢谢。
【问题讨论】:
如果您只是将 Expand-Archive 行更改为:Expand-Archive -Path $zip_location\$zip.Replace(":","_") -DestinationPath $zip_location -Force
刚刚试过。似乎不起作用:Expand-Archive : A positional parameter cannot be found that accepts argument 'System.Object[]'. At line:5 char:5 + Expand-Archive -Path $zip_location\$zip.Replace(":","_") -Destina ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidArgument: (:) [Expand-Archive], ParameterBindingException + FullyQualifiedErrorId : PositionalParameterNotFound,Expand-Archive
【参考方案1】:
使用ZipFile
type 手动提取文件:
# Import the containing assembly
Add-Type -AssemblyName System.IO.Compression.FileSystem
try
# Open the zip file with ZipFile.OpenRead()
$zipFileItem = Get-Item .\Path\To\File.zip
$zipFile = [System.IO.Compression.ZipFile]::OpenRead($zipFileItem.FullName)
foreach($entry in $zipFile.Entries)
# Remove the `:` from any file name
$targetFileName = $entry.Fullname -replace ':','_'
# Create new file on disk, open writable stream
$targetFileStream = $(
New-Item -Path $targetFileName -ItemType File -Force
).OpenWrite()
# Open stream to compressed file, copy to new file stream
$entryStream = $entry.Open()
$entryStream.BaseStream.CopyTo($targetFileStream)
# Clean up
$targetFileStream,$entryStream |ForEach-Object Dispose
finally
# clean up
if($zipFile) $zipFile.Dispose()
【讨论】:
谢谢!这真的很好,除了名字被切断了。文件名(在 zip 文件中)类似于domain.com_FOO:Bar-test1_Username@domain.com_20200416.p12
。提取的文件如下所示:Bar-test1_Username@domain.com_20200416.p12
变量如下所示:$entry.Name
= Bar-test1_Username@domain.com_20200416.p12
$targetFileName
= Bar-test1_Username@domain.com_20200416.p12
$entry
= domain.com_FOO:Bar-test1_Username@domain.com_20200416.p12
@m4xh 更新答案以替换整个:
FullName
属性
好的,今天做了一些测试,我注意到所有.pwd
文件都没有被正确提取。我可以看到$zip_location
中的所有文件,但这些文件的内容是乱码。如果我右键单击-> 属性,它会显示Size on Disk: 0 Bytes
。这些.pwd
文件可以用记事本打开,并且应该只包含几行文本。 Expand-Archive 工作得很好。您知道这里可能存在什么问题吗?以上是关于Powershell - 展开存档并重命名文件,因为它包含无效字符的主要内容,如果未能解决你的问题,请参考以下文章