2017-05-26 52 views
0

我試圖通過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 
) 

我想測試一個簡單的回聲會工作,但錯誤想出了爲引用:該命令的語法不正確。我看到很多來自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的幫助下工作。 enter image description here

+0

沒有爲我生成這個錯誤,只是'按照預期的方式'''''''HOSTNAME'。由於'list'是一個文件名,因此在'for/f'中引用它只會將文件名分配給'%% a'。如果你想要文件的*內容*,那麼你需要使用'usebackq'選項來改變引號的含義。將這個值賦給'hostname'後,您需要'echo'hostname的*內容*而不是常量字符串'HOSTNAME' - 甚至在那裏,因爲'echo'命令在括號內行)(一個「代碼塊」)你需要採取其他措施 - 參見SO延期擴展項目。 – Magoo

回答

0

您讀取文件不起作用的主要原因是由於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!日誌文件行必須位於同一行中。讓我編輯。不能新線 –