2017-05-26 1 views
0

証明書リクエストを生成し、batファイルを使用してCAに送信しようとしています。バットファイル内のすべての行をループします

私はちょうど1ホスト名のためにそれを行うことができますので、これらを自動的に生成するためにバットファイルを実行しています。ここで私が試したことがあります。 hostnames.txtファイルの1行ずつループし、すべての変数を置き換えます。コマンドの構文が正しくありません。私は、単純なエコーが動作しますが、とエラーが思い付いたかどうかをテストしたい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

このエラーは私のために生成されませんでしたが、期待通りに 'echo'ed' HOSTNAME'だけでした。 'list'はファイル名であるので、' for/f'でそれを引用するだけで、ファイル名が '%% a'に割り当てられます。ファイルの* contents *を望むなら、引用符の意味を変更するために 'usebackq'オプションを使う必要があります。値を 'hostname'に代入すれば、' hostname'の* contents *は定数文字列 'HOSTNAME'ではなく' echo'する必要があります。 '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を見てみましょう。

ので、我々はHOSTNAMEに%%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! 
) 
+0

私は正確に従っていますが、それでもまだ言います:コマンドの構文が間違っています/: – Kaycee

+0

私はcmdでbatファイルを実行しています。その権利に問題はありませんか? – Kaycee

+0

最後の部分をコピーしてそのまま実行しましたか? cmd yesから実行できますが、バッチがあるディレクトリにCDを置いて、hostnames.txtが同じフォルダにあることを確認する必要があります。あなたは正確なエラーのスクリーンショットを送ることができますか? PS!ログファイルの行は同じ行になければなりません。私を編集させてください。新しい行にすることはできません –

関連する問題