FOR /F 不适用于批处理文件中逗号分隔的双引号字符串
FOR /F is not working for Comma separated double quoted string in batch file
我无法拆分包含用逗号分隔的双引号字符串的行。字符串类似于:
"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
等波浪号表示法从每个标记中去掉了周围的引号。如果您有意希望将引号保留为变量值的一部分,请删除波浪号。
我无法拆分包含用逗号分隔的双引号字符串的行。字符串类似于:
"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
等波浪号表示法从每个标记中去掉了周围的引号。如果您有意希望将引号保留为变量值的一部分,请删除波浪号。