批量脚本GPG解密

时间:2015-07-29 17:24:32

标签: batch-file gnupg

我正在尝试编写批处理文件来解密已使用相同公钥加密的.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脚本,所以我确信这很简单。

1 个答案:

答案 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

说明:

  • PUSHDPOPD用于临时操纵到另一个目录;
  • 保存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"可能会无意中导致双引号......