CommandLine GPG:解密保留原始文件名

CommandLine GPG:解密保留原始文件名

我有一个批处理文件,用于将文件解密到特定的folder/filename,但我想将文件解密到特定的文件夹,而不更改名称,将其从解密File090620.csv.gpgFile090620.csv

  • 批处理文件命令:
    gpg --no-use-agent --passphrase-file ".\passphrase.txt" --batch -- output ".\dir1" --decrypt "dir2\File090620.csv.gpg"
    

我该怎么做呢?

答案1

将文件路径或文件名放在为了循环然后使用变量替换仅引用所需的部分,即 GPG 格式的文件名,不带扩展名(例如File090620.csv)来运行 GPG 命令。

此外,如果需要的话,扩展此功能以循环遍历目录中的多个文件很简单,只需进行一些调整和测试即可。

命令行

For %A in (*.gpg) do gpg --no-use-agent --passphrase-file ".\passphrase.txt" --batch -- output "%~FNA" --decrypt "%A"

批处理脚本

For %%A in (*.gpg) do gpg --no-use-agent --passphrase-file ".\passphrase.txt" --batch -- output "%%~FNA" --decrypt "%%A"

为什么这个有效...

  • FOR %%A如果未在脚本中运行,则在代码中使用或作为单个百分号设置变量FOR %A。这是将引用单个(或迭代)文件的变量占位符/字符集。

  • in (*.gpg)说明%A或它等于样本盒中当前部分括号%%A中的值。in (SET).\File090620.csv.gpg

  • 引用%%A用于变量替换在 for 循环的命令或执行部分中,作为%%~NA(或 %~NA)扩展它正在迭代的值,或者您仅使用没有扩展名的文件进行设置,这会在您的情况下提供所需的结果,以便在循环命令中相应地使用。

支持资源

  • 为了
  • FOR /?

    此外,FOR 变量的替换引用已得到增强。现在您可以使用以下可选语法:

    %~fI        - expands %I to a fully qualified path name
    %~nI        - expands %I to a file name only
    

答案2

假设该蝙蝠将被保存在与你.gpg保存/接收文件相同的文件夹中。

如果只是单击该蝙蝠,它会获取最新的.gpg文件并在预定的文件夹中对其进行解密然后退出,从而仅接收最后一个文件。

如果.gpg将文件拖放到其上,它将通过参数描述其接收的文件,并将其保存在预期的文件夹中。

只需将变量调整到相关路径即可:

@echo off 

set "_path_gpg=D:\Full\Path\To\gpg.exe"
set "_password=D:\Full\Path\To\Password.txt"
set "_output_dir=D:\Full\Path\To\Output\Folder"

if not "%~dpnx1" == "" (
     set "_decripty=%~dpnx1"
    ) else set "_decripty=%~dp0*.gpg"

for /f tokens^=* %%i in ('dir /b /a:-d /o-d /tc "%_decripty%"')do (
     "%_path_gpg%" --no-use-agent --passphrase-file "%_password%" --batch --output "%_output_Dir%\%%~ni" --decrypt "%%~fi" 
     "%__APPDIR__%timeout.exe" /t 10 & goto :EOF
    )

使用if来处理由参数告知的文件(如果已告知),并else 定义所有*.gpg文件,只是为了dir在循环内第一次运行时列出/获取最新文件并退出。

Timeout.exe只是为了让您休息一下,并检查是否还有其他需要进行的调整,如果没有,您可以将其删除:

"%__APPDIR__%timeout.exe" /t 5 &  goto :EOF
  • 如果您需要该 bat 始终(且仅)解密最后一个文件:
@echo off 

set "_path_gpg=D:\Full\Path\To\gpg.exe"
set "_password=D:\Full\Path\To\Password.txt"
set "_output_dir=D:\Full\Path\To\Output\Folder"


for /f tokens^=* %%i in ('dir /b /a:-d /o-d /tc "%_decripty%"')do (
     "%_path_gpg%" --no-use-agent --passphrase-file "%_password%" --batch --output "%_output_Dir%\%%~ni" --decrypt "%%~fi" 
     goto :EOF
    )

观察:为了更好地理解循环、参数等中变量的扩展变化,我建议访问下面链接的内容,因为我的英语可能会让您感到困惑,或者可能不太清楚,请原谅我。


相关内容