备份我的数据的Powershell脚本从命令行读取密码并将其传递给7zip(7z):
....
$pw = Read-Host -assecurestring -Prompt 'Input Backup Master Passphrase: '
$pw = [Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($pw))
....
& 'C:\Program Files\7-Zip\7z.exe' a -v900M -t7z -mhe=on -mx=9 -p$pw $target/myarchive.7z $src
但是当我在7zip(GUI)中打开存档时,它会向我显示密码提示,输入密码后会显示一个文件(同样是一个7zip文件),该文件也是加密的,但不响应密码。
当我在另一个Powershell脚本中提取文件时,它可以正常工作。
# $pw is read again from commandline via Read-Host....&PtrToStringAuto
& 'C:\Program Files\7-Zip\7z.exe' x -p$pw $target/myarchive.7z
为什么提取仅适用于CLI,而不能通过GUI?
答案 0 :(得分:0)
经过多次实验(对于Science!),我发现7z系列没有按预期工作。在原始代码中,-p$pw
实际上将密码设置为文字$pw
。
快速&脏方法是使用Invoke-Expression
代替:
$inpw = Read-Host -assecurestring -Prompt 'Input Backup Master Passphrase: '
$zpw = [Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($inpw))
$archive = "myarchive.7z"
$src = "testfile.txt"
# using a string formatter to avoid a mess of escaping characters
Invoke-Expression ('& "{0}" a -v900M -t7z -mhe=on -mx=9 -p{1} {2} {3}' -f 'C:\Program Files\7-Zip\7z.exe', $zpw, $archive, $src)
然而,这有关于字符串插值和其他安全/数据问题的重复。您还可以查看Start-Process
或使用.NET Process.Start
方法进行更多控制。