批处理脚本 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
解释:
PUSHD
和POPD
用于临时移动到另一个目录;
- 不需要临时文本文件来保存
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"
可能会无意中导致双引号...
我正在尝试编写一个批处理文件来解密 .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
解释:
PUSHD
和POPD
用于临时移动到另一个目录;- 不需要临时文本文件来保存
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"
可能会无意中导致双引号...