PowerShell调用7zip执行压缩时报unsupported command错误如何解决
报错核心原因
- 参数传递逻辑不符合PowerShell调用外部程序的规则:PowerShell调用外部exe时,如果传入拼接好的整串参数,会将整串作为单个参数交给目标程序,不会按空格自动拆分。你当前写法里
& $7zipPath "a $7zipParams".ToString()会把a -tzip -p{密码} {输出文件名} {源文件}整个字符串作为7z.exe的第一个参数,7z无法识别该组合字符串为合法命令,因此返回unsupported command错误。手动输入命令时系统会自动按空格拆分参数,因此可以正常执行。 - 可选注意点:
(Get-Date).ToShortDateString()的输出受系统区域设置影响,中文系统会返回包含斜杠/的日期格式,而斜杠是Windows文件名非法字符,会导致输出文件名异常,建议替换为格式化日期字符串避免该问题。
修复后的完整代码
function New-BackupZip { [CmdletBinding()] [Alias()] Param ( # 待压缩的源文件 [Parameter(Mandatory=$true, ValueFromPipelineByPropertyName=$true, Position=0)] [String] $File, # 压缩包密码 [String] $Password ) Begin { # 替换为无特殊字符的日期格式,避免文件名非法问题 [String]${Output-Filename} = "Backups_$((Get-Date).ToString('yyyyMMdd')).zip" [string]$7zipPath = "${env:ProgramFiles}\7-Zip\7z.exe" # 用数组存储每个独立参数,是PowerShell调用外部程序的标准写法 [array]$7zipParams = @( "a", "-tzip", "-p$Password", ${Output-Filename}, $File ) } Process { # 直接传递参数数组即可 & $7zipPath $7zipParams } End { } }
内容的提问来源于stack exchange,提问作者francisco.l
相关产品推荐
相关产品推荐

