我正在尝试从给定的 CSV 文件中找到一行并对其进行解析。
这是我的脚本。它位于Extract.bat
:
@echo off
findstr "%DomainName%" C:\LocalSecrets\Deployment.csv > /Temp/Found
set Command=findstr "%DomainName%" C:\LocalSecrets\Deployment.csv
for /F "usebackq" %%A in ('/Temp/Found') do set Size=%%~zA
if (%Size%) == (0) echo Nothing found for [%DomainName%]
if (%Size%) == (0) exit /b
for /F "tokens=* delims=," %%a in ('%Command%') do call :parcsv %%a
:parcsv
echo "%~1" "%~2" "%~3" "%~4" "%~5"
set Domains=%~1
set FtpUsername=%~2
set FtpPassword=%~3
set DatabaseHost=%~4
set Database=%~5
以下是C:\LocalSecrets\Deployment.csv
内容:
domains,ftpUsername,ftpPassword,databaseHost,database
"example.com,admin.example.com",example.com,kasouzxclkjoiuwelrkjlsd,localhost,Example
"new.example2.ir,admin.example2.ir",example2.ir,xldkwuclxksker,localhost,Example2
"new.example3.com,admin.example3.com",example3.com,knidklcislekrjsl,localhost,Example3
如果你拨打电话,Extract.bat example3.com
你会得到以下回应:
"example3.com,admin.example3.com" "example3.com" "knidkslcislekrjsl" "localhost" "Example3"
"" "" "" "" ""
如你所见,结果的最后一行不应该出现。为什么我的代码运行了两次?
答案1
你忘了退出脚本在最后,所以它只是继续进入之后的部分:parcsv
。
:parcsv
只是一个 GOTO 标签——它没有定义“函数”,没有创建新的作用域;解释器将执行所有的从上到下编写脚本。
(尽管后来的 Windows 版本允许通过 调用此类标签作为子程序call :label
,但这并没有从根本上改变脚本的结构——它仍然作为单个代码块工作,甚至被调用的子程序在到达末尾之前不会自动返回。)
为了避免这种情况,您需要在“主”代码后使用exit /b
或goto :EOF
(如果有多个“子程序”,则在每个“子程序”末尾也使用或)。
@echo 关闭 查找字符串 ... 对于/F“usebackq”... if (%Size%) == (0) echo 没有找到 [%DomainName%] 如果(%Size%)==(0)退出/b 对于 /F ... 调用 :parcsv %%a 转到:EOF :parcsv 回显“%~1”“%~2”“%~3”“%~4”“%~5” 设置域=%~1 设置 FtpUsername=%~2 设置 FtpPassword=%~3 设置数据库主机=%~4 设置数据库=%~5 转到:EOF :附加子程序 做一点事... 转到:EOF :其他子程序 做一点事... 转到:EOF
如果你想要真正的函数(和真正的 CSV 解析器),请使用 PowerShell。