使用WZUNZIP.EXE命令行在PowerShell中解压出现冗余结构问题
我有一个名为LatestFiles_20241130031004.zip的压缩文件,需解压至LatestFiles_20241130031004文件夹。该压缩包结构如下:
LatestFiles_20241130031004.zip ----Folder A ----Folder B ---------Folder 1 ----------File 1 ----------File 2
执行以下PowerShell代码:
& $WinZipexe\WZUNZIP.EXE -d "E:\TEMP\folder\LatestFiles_20241130031004.zip" "E:\TEMP\folder\" 2> $null
得到的解压结果存在冗余结构:
LatestFiles_20241130031004 ----Folder A ----Folder B ---------Folder 1 ----------File 1 ----------File 2 ----Folder 1 ----LatestFiles_20241130031004 --------Folder A --------Folder B -----------Folder 1 --------------File 1 --------------File 2 ----File 1 ----File 2
而期望的正确解压结果为:
LatestFiles_20241130031004 ----Folder A ----Folder B ---------Folder 1 ----------File 1 ----------File 2
该命令在命令提示符(CMD)中直接执行结果正常,但在PowerShell中执行异常,需要解决思路。
修正目标路径格式
去掉目标路径末尾的反斜杠,PowerShell对路径末尾反斜杠的解析逻辑和CMD存在差异,可能导致路径识别异常。修改后的命令:& $WinZipexe\WZUNZIP.EXE -d "E:\TEMP\folder\LatestFiles_20241130031004.zip" "E:\TEMP\folder" 2> $null直接指定目标文件夹
明确将解压路径指向期望的LatestFiles_20241130031004文件夹,避免程序自动推断路径时生成冗余结构:& $WinZipexe\WZUNZIP.EXE -d "E:\TEMP\folder\LatestFiles_20241130031004.zip" "E:\TEMP\folder\LatestFiles_20241130031004" 2> $null通过CMD中转执行
既然CMD下执行正常,可在PowerShell中调用CMD运行解压命令,规避PowerShell的参数解析差异:cmd /c "$WinZipexe\WZUNZIP.EXE -d ""E:\TEMP\folder\LatestFiles_20241130031004.zip"" ""E:\TEMP\folder\""" 2> $null注意用双引号嵌套(两个双引号代表一个双引号)保证路径参数正确传递。
使用Start-Process调用外部程序
PowerShell的Start-Process能更精准控制外部程序的参数传递,避免参数解析混乱:Start-Process -FilePath "$WinZipexe\WZUNZIP.EXE" ` -ArgumentList '-d', 'E:\TEMP\folder\LatestFiles_20241130031004.zip', 'E:\TEMP\folder\LatestFiles_20241130031004' ` -NoNewWindow -Wait -RedirectStandardError $null-NoNewWindow确保在当前窗口执行,-Wait等待解压完成,-RedirectStandardError屏蔽错误输出。检查WinZip参数顺序
确认wzunzip的语法为wzunzip [options] zipfile [target-path],确保-d选项放在最前面,压缩包路径和目标路径顺序正确,避免PowerShell对参数顺序的误解析。
内容的提问来源于stack exchange,提问作者user2073183

