我在分割包含用逗号分隔的双引号字符串的行时遇到麻烦。字符串看起来像:
"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
等,围绕每个令牌引号条。如果您有意将引号保留为变量值的一部分,请删除波浪号。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句