在 Windows 批处理文件中,如何使用具有多个引号字符串的命令来 FOR /F

在 Windows 批处理文件中,如何使用具有多个引号字符串的命令来 FOR /F

以下命令可以正常工作:

"C:\Program Files (x86)\KeePass Password Safe 2\KPScript.exe" -c:GetEntryString "C:\Users\Me\Documents\KeePass Database.kdbx" -useraccount -field:Password -ref-Title:"Data Partition" -FailIfNotExists -FailIfNoEntry

它从 KeePass 数据库中返回密码。在批处理文件中,我想将其结果放入变量中,以便可以将其传递给另一个程序。

我在批处理文件中尝试了以下内容:

@ECHO OFF
SETLOCAL EnableDelayedExpansion
FOR /F "tokens=* usebackq" %%F IN (`"C:\Program Files (x86)\KeePass Password Safe 2\KPScript.exe" -c:GetEntryString "C:\Users\Me\Documents\KeePass Database.kdbx" -useraccount -field:Password -ref-Title:"Data Partition" -FailIfNotExists -FailIfNoEntry`) DO SET pw=%%F
ECHO %pw%
ENDLOCAL

但调用该批处理文件会返回:

“C:\Program” 未被识别为内部或外部命令、可运行程序或批处理文件。

我尝试在 FOR 中的命令周围加上引号:

@ECHO OFF
SETLOCAL EnableDelayedExpansion
FOR /F "tokens=* usebackq" %%F IN (`""C:\Program Files (x86)\KeePass Password Safe 2\KPScript.exe" -c:GetEntryString "C:\Users\Me\Documents\KeePass Database.kdbx" -useraccount -field:Password -ref-Title:"Data Partition" -FailIfNotExists -FailIfNoEntry"`) DO SET pw=%%F
ECHO %pw%
ENDLOCAL

这次我得到了:

\KeePass这时候是出乎意料的。

正确的语法是什么才能使它工作?谢谢。

答案1

应用后一种方法使用插入符号转义右括号,如下所示:

FOR /F "tokens=* usebackq" %%F IN (`""C:\Program Files (x86^)\KeePass …

或者

FOR /F "tokens=* usebackq" %%F IN (`""%ProgramFiles(x86):)=^)%\KeePass …

此外,总是

  • 使用设置变量延迟扩张!禁用以防止(可能存在的)感叹号扩展;
  • 使用双引号设置变量(如下所示SET "pw=%%F")逃避(可能存在的)cmd有害字符,如&、、<等等|……;
  • 使用变量延迟扩张已启用。

然后,您的脚本可能如下所示(更新):

@ECHO OFF
SETLOCAL EnableExtensions DisableDelayedExpansion
rem remove variable `pw`
set "pw="
FOR /F "tokens=* usebackq" %%F IN (`""C:\Program Files (x86^)\KeePass Password Safe 2\KPScript.exe" -c:GetEntryString "C:\Users\Me\Documents\KeePass Database.kdbx" -useraccount -field:Password -ref-Title:"Data Partition" -FailIfNotExists -FailIfNoEntry"`) DO (
   rem set only first output line to variable `pw`
   if NOT defined pw SET "pw=%%F"
)
SETLOCAL EnableDelayedExpansion
ECHO !pw!
ENDLOCAL 

相关内容