Batch file 循环遍历bat文件中的每一行

Batch file 循环遍历bat文件中的每一行,batch-file,Batch File,我正在尝试生成证书请求并通过bat文件提交给CA 我只需要一个主机名就可以做到这一点,所以我正在做一个bat文件来自动生成所有这些。这是我试过的。它应该在hostnames.txt文件中逐行循环并替换所有变量 引用 我想测试一个简单的echo是否可以工作,但出现的错误是:命令的语法不正确。我从stackoverflow中看到了很多参考资料,但它无法找出问题所在 下面是我将实施后,上述是固定的 openssl req -nodes -newkey rsa:2048 -nodes -keyout %

我正在尝试生成证书请求并通过bat文件提交给CA

我只需要一个主机名就可以做到这一点,所以我正在做一个bat文件来自动生成所有这些。这是我试过的。它应该在hostnames.txt文件中逐行循环并替换所有变量

引用

我想测试一个简单的echo是否可以工作,但出现的错误是:命令的语法不正确。我从stackoverflow中看到了很多参考资料,但它无法找出问题所在

下面是我将实施后,上述是固定的

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
ed
HOSTNAME
。由于
列表
是一个文件名,因此在
中为/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!
)