批处理脚本 GPG 解密

Batch scripting GPG decryption

我正在尝试编写一个批处理文件来解密 .gpg 个文件的文件夹,这些文件都使用相同的 public 密钥加密。这是我目前所拥有的:

@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]

这是我第一次尝试编写批处理脚本,所以我确信它很简单。

以下应该有效:

@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 () 中的集合包含在内使用 '',因此它被解释为命令,而不是文件规范。);
  • 截断文件扩展名(你想用第二个临时文件和内部 FOR 循环做什么,至少根据我的解释),你只需要给修饰符 ~n,在我们的情况下%%~nF;您的方法不起作用,因为:
    • 您不能像 namelen-4 尝试的那样进行内联数学运算(您需要将中间变量与 SET /A 一起用于算术运算,并且 delayed expansion 必须那就活跃起来);
    • :~0,8 这样的子字符串扩展不适用于 FOR 变量(你需要一个临时变量来做到这一点,然后 delayed expansion 必须再次激活);

加法:
如果脚本在输入文件名中存在空格问题,您可能需要将 gpg 命令行替换为:

gpg --output "%%~nF" --batch --yes --passphrase %password% --decrypt "%%~F"

~ 修饰符删除了潜在的双引号,因此 "%%~nF""%%~F" 总是用双引号将文件名括起来。请注意 "%%F" 可能会无意中导致双引号...