我在分割包含用逗号分隔的双引号字符串的行时遇到问题。字符串看起来像:
"DevLoc","/Root/Docs/srvr/temp test","171.118.108.22","/Results/data/Procesos Batch","C:\DataExport\ExportTool\Winsock Folder DB","C:\Export\ExportTool\Temp Folder","22"
某些字符串值包含空格。我想将每个双引号字符串存储到一个变量中。有谁可以帮忙吗
下面是我的批处理脚本。变量“EnvDetails”包含上面需要解析的行。
FOR /F "tokens=1,2,3,4,5,6,7 delims=," %%i in ("%EnvDetails%") do (
SET TEMPS=%%i
SET Path=%%j
SET host=%%k
SET scriptPath=%%l
SET WINSP_HOME=%%m
SET PUTTY_HOME=%%n
SET portNum=%%o
@echo %TEMPS% > temp.txt
@echo %MPath% >> temp.txt
@echo %host% >> temp.txt
@echo %scriptPath% >> temp.txt
@echo %WINSCP_HOME% >> temp.txt
@echo %PUTTY_HOME% >> temp.txt
@echo %portNum% >> temp.txt
)
最佳答案
问题的一部分是您尝试在设置的同一括号代码块中检索变量值。由于 cmd 解释器在执行命令之前将变量替换为其值,因此您基本上将空值回显到 temp.txt。要等到变量定义完毕后再扩展它们,您需要延迟扩展。
但是你确实让事情变得比需要的更加复杂。除了将变量回显到文本文件之外,您还对变量做什么?
您应该做的是使用基本的 for
循环而不是 for/f
。不带任何开关的 for
无论如何都会评估类似于 CSV 解析器的行,以逗号、分号、不带引号的空格和制表符等分隔。
鉴于您基本上是用逗号分割一行并按顺序将每个标记回显到文本文件,每行一个标记,您可以像这样简化代码:
@echo off
>temp.txt (
for %%I in (%EnvDetails%) do echo %%~I
)
如果我错了,并且您确实打算对数据进行进一步处理;如果您确实需要这些变量,那么此示例演示了延迟扩展:
@echo off
setlocal
set EnvDetails="DevLoc","/Root/Docs/srvr/temp test","171.118.108.22","/Results/data/Procesos Batch","C:\DataExport\ExportTool\Winsock Folder DB","C:\Export\ExportTool\Temp Folder","22"
>temp.txt (
FOR /F "tokens=1-7 delims=," %%i in ("%EnvDetails%") do (
SET "TEMPS=%%~i"
SET "MPath=%%~j"
SET "host=%%~k"
SET "scriptPath=%%~l"
SET "WINSCP_HOME=%%~m"
SET "PUTTY_HOME=%%~n"
SET "portNum=%%~o"
setlocal enabledelayedexpansion
echo !TEMPS!
echo !MPath!
echo !host!
echo !scriptPath!
echo !WINSCP_HOME!
echo !PUTTY_HOME!
echo !portNum!
endlocal
)
)
最后一点:%%~i
、%%~j
等波浪号表示法会去除每个标记周围的引号。如果您有意希望保留引号作为变量值的一部分,请删除波形符。
关于regex - FOR/F 不适用于批处理文件中的逗号分隔双引号字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30217932/