为什么我的脚本的某些部分运行多次?

为什么我的脚本的某些部分运行多次?

我正在尝试从给定的 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 /bgoto :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。

相关内容