2017-05-26 6 views
0

Ich versuche, Zertifikatsanforderung zu generieren und an CA über Bat-Datei zu senden.Schleife durch jede Zeile in Fledermaus-Datei

Ich kann es für nur 1 Hostname tun, also mache ich eine Fledermaus-Datei, um all diese automatisch zu generieren. Hier ist, was ich versucht habe. Es soll Zeile für Zeile in der Datei hostnames.txt durchlaufen und alle Variablen ersetzen.

Referenzierung von 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 
) 

ich testen wollen, ob ein einfaches Echo funktioniert aber der Fehler kam als: Die Syntax des Befehls ist falsch. Ich habe viele Referenzen von stackoverflow gesehen, aber es kann nicht herausfinden, was falsch ist.

Unten ist was ich implementieren werde, nachdem das obige fest ist.

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% 

Ich weiß, das wurde oft gefragt, aber meins scheint nicht zu funktionieren .. Vielen Dank im Voraus für Ihre Hilfe!

UPDATE: Aktuelle Konfiguration, die nach Hilfe von Gerhard Barnard funktioniert.

+0

Ich habe diesen Fehler nicht für mich generiert, nur 'echo'ed' HOSTNAME' wie erwartet. Da 'list' ein Dateiname ist, wird der Dateiname einfach' '%% a' 'zugewiesen, wenn Sie ihn in' for/f' angeben. Wenn Sie den * Inhalt * der Datei wünschen, brauchen Sie nicht die 'usebackq'-Option, um die Bedeutung der Anführungszeichen zu ändern. Wenn Sie den Wert für 'hostname' festgelegt haben, müssten Sie den * Inhalt * von' hostname' - nicht den Konstantenstring 'HOSTNAME' -" echo "- und auch dort, da der Befehl' echo' innerhalb einer eingeklammerten Sequenz von Zeilen) (ein "' code block "") müssen Sie andere Maßnahmen ergreifen - siehe SO-Punkte auf 'verzögerte Expansion '. – Magoo

Antwort

0

Der Hauptgrund, warum Ihr Lesen der Datei nicht funktioniert, liegt an der "" in der for-Schleife.

Dies funktioniert, müssen Sie wirklich %%a zu Hostnamen neu zuweisen, wenn Sie wissen, dass %%a Hostname ist?

@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 
          ) 

haben einen Blick auf setlocal DELAYEDEXPANSION sonst die Variablen innerhalb der Schleife nur einmal erweitert wird.

so, wenn wir %%a zu HOST zuweisen möchten wir dies tun:

@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! 
) 

komplette Skript.

+0

Ich folgte genau, aber es sagt immer noch: Die Syntax des Befehls ist falsch /: – Kaycee

+0

Ich führe die bat-Datei in der cmd. Es gibt kein Problem in diesem Recht? – Kaycee

+0

Haben Sie den letzten Teil kopiert und so ausgeführt? Sie können es von cmd ja ausführen, aber Sie müssen auf CD zu dem Verzeichnis, in dem der Stapel ist, und stellen Sie sicher, dass die hostnames.txt im selben Ordner ist. Können Sie einen Screenshot des genauen Fehlers senden? PS !! Die Protokolldatei muss in derselben Zeile stehen. Lass mich bearbeiten. kann nicht neu sein Zeile –

Verwandte Themen