以下命令可以正常工作:
"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