Batch file 循环遍历bat文件中的每一行
我正在尝试生成证书请求并通过bat文件提交给CA 我只需要一个主机名就可以做到这一点,所以我正在做一个bat文件来自动生成所有这些。这是我试过的。它应该在hostnames.txt文件中逐行循环并替换所有变量 引用 我想测试一个简单的echo是否可以工作,但出现的错误是:命令的语法不正确。我从stackoverflow中看到了很多参考资料,但它无法找出问题所在 下面是我将实施后,上述是固定的Batch file 循环遍历bat文件中的每一行,batch-file,Batch File,我正在尝试生成证书请求并通过bat文件提交给CA 我只需要一个主机名就可以做到这一点,所以我正在做一个bat文件来自动生成所有这些。这是我试过的。它应该在hostnames.txt文件中逐行循环并替换所有变量 引用 我想测试一个简单的echo是否可以工作,但出现的错误是:命令的语法不正确。我从stackoverflow中看到了很多参考资料,但它无法找出问题所在 下面是我将实施后,上述是固定的 openssl req -nodes -newkey rsa:2048 -nodes -keyout %
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%
我知道这个问题已经问过很多次了,但我的似乎不起作用。。提前感谢您的帮助
更新:
在Gerhard Barnard的帮助下工作的当前配置。
读取文件不起作用的主要原因是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
)
请查看setlocaldelayedexpansion
否则循环中的变量只展开一次
因此,如果我们想将%%a
分配给主机名,我们可以这样做:
@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!
)
没有为我生成该错误,只是像预期的那样
echo
edHOSTNAME
。由于列表
是一个文件名,因此在中为/f
引用它只会将文件名分配给%%a
。如果需要文件的内容,则需要使用usebackq
选项来更改引号的含义。将值分配给hostname
后,您需要echo
主机名的内容,而不是常量字符串hostname
,甚至在那里,因为echo
命令位于括号内的行序列中(“代码块
”)您需要采取其他措施-请参阅延迟扩展
上的SO项。我完全按照了,但它仍然说:命令的语法不正确/:我正在cmd中执行bat文件。这方面没有问题吗?您复制了最后一部分并按原样运行了吗?您可以从cmd yes运行它,但必须将其CD到批处理所在的目录,并确保hostnames.txt位于同一文件夹中。你能发送一个准确错误的截图吗?附言日志文件行必须在同一行中。让我来编辑。无法使用当前配置更新我的问题!好吧,但那是错误的。看到我如何在代码中使用主机名了吗<代码>!主机名ad not%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!
)