Пакетный скрипт расшифровки GPG

Я пытаюсь написать пакетный файл для расшифровки папки из .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]

Это мой первый раз, когда я пытаюсь написать пакетный скрипт, поэтому я уверен, что это что-то простое.


person Morgan Thrapp    schedule 29.07.2015    source источник
comment
namelen выглядит неправильно. Вы устанавливаете его повторно и никогда не используете. Вам могут понадобиться setlocal enabledelayedexpansion, set /a namelen=!namelen!-4 и gpg --output %%F:~0, !namelen!, чтобы сделать то, что вы пытаетесь сделать.   -  person TessellatingHeckler    schedule 29.07.2015
comment
Согласно другому ответу, который я нашел, это должно дать мне длину строки %%L, хотя теперь я заметил, что у меня там опечатка.   -  person Morgan Thrapp    schedule 29.07.2015


Ответы (1)


Следующее должно работать:

@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 () заключен в '', поэтому он интерпретируется как команда, а не спецификация файла.);
  • to truncate the file extension (what you want to do with the second temporary file and the inner FOR loop, at least according to my interpretation), you just need to give the modifier ~n, in our situation %%~nF; your method did not work because:
    • you cannot do in-line maths like you tried by namelen-4 (you would need to use an interim variable together with SET /A for arithmetic operations, and also delayed expansion had to be active then);
    • расширение подстроки, например :~0,8, не работает с переменными FOR (для этого вам понадобится промежуточная переменная, и снова отложенное расширение должен был быть активным тогда);

Дополнение:
Если у сценария есть проблемы с пробелами в именах входных файлов, вам может понадобиться заменить командную строку gpg на это:

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

Модификаторы ~ удаляют возможные окружающие двойные кавычки, поэтому "%%~nF" и "%%~F" всегда заключают имя файла в двойные кавычки. Обратите внимание, что "%%F" может непреднамеренно привести к двойным двойным кавычкам...

person aschipfl    schedule 29.07.2015
comment
Красивый. Благодарю вас! - person Morgan Thrapp; 29.07.2015
comment
Потрясающий. Я никогда раньше не делал никаких пакетных сценариев, так что это действительно здорово увидеть. - person Morgan Thrapp; 29.07.2015
comment
// , Как я могу сделать это таким образом, чтобы цепочка ключей Gnu Privacy Guard уже имела расшифрованный и кэшированный в памяти закрытый ключ? - person Nathan Basanese; 24.10.2018
comment
Извините, @NathanBasanese, я не могу вам с этим помочь; Я просто ответил на этот вопрос, потому что это была чистая проблема batch-file; Я не знаю никаких подробностей о gpg... - person aschipfl; 25.10.2018