循环遍历bat文件中的每一行
问题描述:
我试图通过bat文件生成证书请求并提交给CA.循环遍历bat文件中的每一行
我能够做到只有1个主机名,所以我正在做一个bat文件来自动生成所有这些。这是我尝试过的。它应该在hostnames.txt文件中逐行循环并替换所有变量。
从How do you loop through each line in a text file using a windows batch file?
set CA_SERVER=xxxx
set CA_NAME=xxxx
set LOGFILE=.\RequestCert.log
set LIST=hostnames.txt
if not exist %LIST% (
echo %DATE% : %TIME% : ERROR : The list of hostnames file %LIST% is
missing. Cannot request certificate. Exiting! >> %LOGFILE%)
for /f "tokens=*" %%a in ("%LIST%") do (
set HOSTNAME=%%a
echo HOSTNAME
)
我想测试一个简单的回声会工作,但错误想出了为引用:该命令的语法不正确。我看到很多来自*的引用,但它无法弄清楚什么是错的。
以上是我在上述修正后实施的。
openssl req -nodes -newkey rsa:2048 -nodes -keyout %HOSTNAME%.key -out
%HOSTNAME%.csr -subj "/C=SG/ST=/L=xxx/O=xxx/OU=xxx
/CN=%HOSTNAME%"
certreq -submit -f -config "%CA_SERVER%\%CA_NAME%" -attrib
CertificateTemplate:SSLCert" %HOSTNAME%.csr
echo Generating certificate request and key for %HOSTNAME%
我知道这已被问了很多次,但我的似乎没有工作..预先感谢您的帮助!
答
您读取文件不起作用的主要原因是由于for循环中的""
。
这将起作用,如果您知道%%a
是主机名,您是否真的需要将%%a
重新指定给主机名?
@echo off
set CA_SERVER=xxxx
set CA_NAME=xxxx
set LOGFILE=.\RequestCert.log
set LIST=hostnames.txt
if not exist %LIST% (
echo %DATE% : %TIME% : ERROR : The list of hostnames file %LIST% is missing. Cannot request certificate. Exiting! >> %LOGFILE%)
FOR /F "tokens=*" %%a in (%LIST%) do (
echo %%a
)
看看setlocal DELAYEDEXPANSION
其他变量内环路只有一次扩大。
所以如果我们想给%%a
到HOSTNAME我们这样做:
@echo off
setlocal ENABLEDELAYEDEXPANSION
set CA_SERVER=xxxx
set CA_NAME=xxxx
set LOGFILE=.\RequestCert.log
set LIST=hostnames.txt
if not exist %LIST% (
echo %DATE% : %TIME% : ERROR : The list of hostnames file %LIST% is missing. Cannot request certificate. Exiting! >> %LOGFILE%)
for /f "tokens=*" %%a in (%LIST%) do (
set "HOSTNAME=%%a"
echo !HOSTNAME!
)
完整的脚本。
@echo off
setlocal ENABLEDELAYEDEXPANSION
set CA_SERVER=xxxx
set CA_NAME=xxxx
set LOGFILE=.\RequestCert.log
set LIST=hostnames.txt
if not exist %LIST% (
echo %DATE% : %TIME% : ERROR : The list of hostnames file %LIST% is missing. Cannot request certificate. Exiting! >> %LOGFILE%)
for /F "tokens=*" %%a in (%LIST%) do (
set "HOSTNAME=%%a"
echo !HOSTNAME!
openssl "req -nodes -newkey rsa:2048 -nodes -keyout !HOSTNAME!.key -out !HOSTNAME!.csr -subj "/C=SG/ST=/L=xxx/O=xxx/OU=xxx /CN=!HOSTNAME!"
certreq -submit -f -config "%CA_SERVER%\%CA_NAME%" -attrib CertificateTemplate:SSLCert" !HOSTNAME!.csr
echo Generating certificate request and key for !HOSTNAME!
)
没有为我生成这个错误,只是'按照预期的方式'''''''HOSTNAME'。由于'list'是一个文件名,因此在'for/f'中引用它只会将文件名分配给'%% a'。如果你想要文件的*内容*,那么你需要使用'usebackq'选项来改变引号的含义。将这个值赋给'hostname'后,您需要'echo'hostname的*内容*而不是常量字符串'HOSTNAME' - 甚至在那里,因为'echo'命令在括号内行)(一个“代码块”)你需要采取其他措施 - 参见SO延期扩展项目。 – Magoo