我正在尝试编写批处理文件来解密已使用相同公钥加密的.gpg
个文件的文件夹。这就是我到目前为止所做的:
@ECHO off
SET outbound=C:\encrypted files
SET olddir=%CD%
SET password=correcthorsebatterystaple
CD /d %outbound%
DIR *.gpg /B > tmp.txt
FOR /F "tokens=*" %%F IN (tmp.txt) DO (
ECHO %%F > tmplen.txt
FOR %%L IN (tmplen.txt) DO (SET namelen=%%~zL)
DEL tmplen.txt
gpg --output %%F:~0, namelen-4 --batch --yes --passphrase %password% --decrypt %%F)
DEL tmp.txt
CD /d %olddir%
目前它只是打印
usage: gpg [options] [filename]
这是我第一次尝试编写Batch脚本,所以我确信这很简单。
答案 0 :(得分:3)
以下内容应该有效:
@ECHO off
SET password=correcthorsebatterystaple
PUSHD "C:\encrypted files"
FOR /F "tokens=*" %%F IN ('DIR *.gpg /B') DO (
gpg --output %%~nF --batch --yes --passphrase %password% --decrypt %%F)
POPD
说明:
PUSHD
和POPD
用于临时操纵到另一个目录; DIR
的输出不需要临时文本文件,因为FOR
也能够解析命令的输出(IN ()
中的集合附带{ {1}}所以它被解释为命令,而不是文件规范。); ''
循环做什么,至少根据我的解释),你只需要给出修饰符FOR
,在我们的情况~n
;你的方法不起作用,因为:
%%~nF
那样尝试在线数学(你需要使用临时变量和namelen-4
进行算术运算,并且delayed expansion也必须是活动的然后); SET /A
这样的子字符串扩展不适用于:~0,8
个变量(您需要一个临时变量来执行此操作,然后delayed expansion必须再次激活;)增加:
如果脚本在输入文件名中出现空格问题,则可能需要将FOR
命令行与此交换:
gpg
gpg --output "%%~nF" --batch --yes --passphrase %password% --decrypt "%%~F"
修饰符会移除潜在的双引号,因此~
和"%%~nF"
始终用双引号括起文件名。请注意,"%%~F"
可能会无意中导致双引号......