循环遍历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% 

我知道这已被问了很多次,但我的似乎没有工作..预先感谢您的帮助!

更新: 当前配置在Gerhard Barnard的帮助下工作。 enter image description here

+0

没有为我生成这个错误,只是'按照预期的方式'''''''HOSTNAME'。由于'list'是一个文件名,因此在'for/f'中引用它只会将文件名分配给'%% a'。如果你想要文件的*内容*,那么你需要使用'usebackq'选项来改变引号的含义。将这个值赋给'hostname'后,您需要'echo'hostname的*内容*而不是常量字符串'HOSTNAME' - 甚至在那里,因为'echo'命令在括号内行)(一个“代码块”)你需要采取其他措施 - 参见SO延期扩展项目。 – Magoo

您读取文件不起作用的主要原因是由于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! 
) 
+0

我遵循完全,但它仍然说:该命令的语法不正确/: – Kaycee

+0

我正在cmd中执行bat文件。这个权利没有问题吗? – Kaycee

+0

您是否复制了最后一部分并按原样运行?你可以从cmd运行yes,但是你必须将CD运行到批处理所在的目录,并确保hostnames.txt位于同一个文件夹中。你能发送确切的错误截图吗? PS!日志文件行必须位于同一行中。让我编辑。不能新线 –