perseus21
Goto Top

Batchscripts

Hallo,
ich suche nach einer Lösung um mit CMD folgendes Problem zu lösen:

Ich möchte, daß der Benutzer mittels einer set /p Eingabe mehrere Eingaben (Rechnernamen) macht, diese dann in eine
Datei geschrieben werden und dann vom System aus der Datei benutzt werden können.

Bsp: Ein Benutzer gibt mehrere Computernamen an, die dann das System anpingen kann.

Gruß
Dirk

Content-Key: 232939

Url: https://administrator.de/contentid/232939

Printed on: April 26, 2024 at 16:04 o'clock

Member: bastla
bastla Mar 18, 2014 at 15:35:52 (UTC)
Goto Top
Hallo perseus21 und willkommen im Forum!

Ungetestet etwa so:
@echo off & setlocal
set "Datei=D:\Deine Liste.txt"  

del "%Datei%" 2>nul  
:Loop
set "Ein="  
set /p Ein=Bitte einen Rechnernamen eingeben oder nur ENTER für Ende der Eingabe: 
if not defined Ein goto :EndeEingabe
setlocal enabledelayedexpansion
>>"%Datei%" echo !Ein!  
endlocal
goto :Loop

:EndeEingabe
cls
echo Eingegeben wurde:
type "%Datei%"  
Grüße
bastla
Member: rubberman
rubberman Mar 18, 2014 updated at 16:58:46 (UTC)
Goto Top
Hallo perseus21,
auch von mir ein Willkommen.

bastla hat ja bereits eine gute Vorlage gegeben, wie man Benutzereingaben in eine Datei schreiben kann. Aber was man unter ...
... und dann vom System aus der Datei benutzt werden können ...
... verstehen soll, erschließt sich mir nicht.
Redest du vom Betriebssystem? Und wie willst du dem "System" beibringen, irgendeine x-beliebige Datei zu "benutzen" oder deren Inhalte anzupingen? Da fehlt mir noch ein bisschen Info und vor allem was am Ende dabei als Output herauskommen soll. (Oder hast du da schon konkrete Ansätze und benötigst für diesen Teil deines Problemchens keinen Support?)

Grüße
rubberman
Member: perseus21
perseus21 Mar 19, 2014 at 09:06:44 (UTC)
Goto Top
Guten morgen,
erstmal vielen Dank für die sehr schnellen Antworten.
Also, Hintergrund ist folgender:

Ich möchte über CMD mehrere Rechnernamen eingeben, diese sollen in eine Textdatei abgelegt werden.
Das Script soll jetzt einen Registrywert in die Registry der in der Liste stehenden PC´s schreiben.

So sieht momentan meine unvollständige bat aus: (Bitte nicht wundern, bin blutiger Anfänger was sripten/batchen betrifft)

@echo off & setlocal
CLS
set "datei=\\Servername\Pfad\liste.txt" ;von bastla übernommen
del %datei% 2>NUL ;von bastla übernommen
echo;
echo >>> Unterbinden von extrem langen Anmeldezeiten bei Erstanmeldung an einem Win XP Rechner <<<
echo;
set "Ein=" ;von bastla übernommen

echo Auf welchen Rechnern soll der Registry Wert gesetzt werden?

:pcs
set /p apc=Computername:
if not defined apc goto :ende_neg
setlocal enabledelayedexpansion ;von bastla übernommen
%datei% echo !apc! ;von bastla übernommen
endlocal ;von bastla übernommen
goto :pcs

:reg
echo j| reg add "\\%apc%\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v BufferPolicyReads /t REG_DWORD /d 1 >NUL
echo;
echo;
goto :ende_pos

:ende_neg
echo;
echo Es wurden keine Eingaben gemacht...
pause
exit

:ende_pos
echo Žnderungen wurden erfolgreich vollzogen...
pause
exit

Nachdem ich die Zeilen von bastla übernommen habe kann ich mehrere Eingaben machen. Nur funktioniert die Schleife nicht richtig. Wenn ich
nur ENTER drücke bleibt er in der Schleife und schreibt die letzte Eingabe in die Datei.

Klarer geworden?

Gruß
Dirk
Member: perseus21
perseus21 Mar 19, 2014 at 09:13:13 (UTC)
Goto Top
Hallo Bastla,
erstmal guten morgen und vielen Dank für die schnelle Antwort.
Was bezwecken folgende Zeilen?
Habe meine *.bat mit deinen Angaben erweitert und im Kommentar von rubberman eingestellt.

Was bezwecken folgende Zeilen?:

1) set"Ein="
2) setlocal enabledelayexpansion
3) >>"%Datei%" echo !Ein!

Gruß
Dirk
(perseus21)
Member: bastla
bastla Mar 19, 2014 at 12:27:30 (UTC)
Goto Top
Hallo perseus21!
set"Ein="
Damit wird der Inhalt der Variablen Ein gelöscht, sodass bei Eingabe von nur Enter die Variable tatsächlich leer ist (und nicht den vorherigen Wert behält).
setlocal enabledelayexpansion
>>"%Datei%" echo !Ein!
Dazu gehört auch noch das "endlocal"; durch die Verwendung der "delayedExpansion" werden auch Sonderzeichen wie "&" oder "|", die ansonsten in Batch eine besondere Bedeutung haben, als "gewöhnlicher" Text behandelt und unverändert in die Datei geschrieben, ohne ev Fehler zu verursachen.

Die "echo"-Zeile sorgt für das Schreiben der Eingabe in die Datei (mit ">>" wird die neue Zeile angefügt, bei nur einem Umleitungszeichen würde die Datei immer überschrieben und daher am Ende nur den letzten eingegebenen Wert enthalten. Wegen der genannten "delayedExpansion" muss anstelle des üblichen Prozentzeichens (also "%Ein%") der Variablenname mit "!" begrenzt werden.

Dass die Ausgabe-Umleitung schon vor dem "echo" steht, beugt einem ev Problem der folgenden Art vor: Wenn %Ein% (bzw !Ein!) etwa den Inhalt "Rechner 2" hätte, würde ein nachgestelltes ">>"%Datei%"" als Ziel für die Ausgabe der Fehlermeldung auf "Kanal 2" (also "2>>") interpretiert und daher nix in die Datei schreiben - kannst Du einfach testen, indem Du direkt in CMD eingibst:
echo Rechner 2>>"Test.txt"
Die Alternative, zwischen "2" und ">>" ein Leerzeichen zu setzen, würde zwar diesen Effekt vermeiden, dafür aber das Leerzeichen mit in die Datei schreiben.
Jetzt zu Deinem Code: Wenn Du anscheinend sofort nach der Eingabe das Schreiben in die Registry veranlassen möchtest (mit dem Risiko, dass etwa der Zielrechner nicht eingeschaltet wäre), brauchst Du eigentlich die Datei gar nicht (oder allenfalls als Log, welche Rechner bearbeitet wurden) - in diesem Fall sollte das (ungetestet) etwa so gehen:
echo off & setlocal
CLS
set "datei=\\Servername\Pfad\liste.txt"  
del "%datei%" 2>NUL  
echo;
echo >>> Unterbinden von extrem langen Anmeldezeiten bei Erstanmeldung an einem Win XP Rechner <<<
echo;

echo Auf welchen Rechnern soll der Registry Wert gesetzt werden?

:pcs
set "Ein=" ;von bastla übernommen  
set /p apc=Computername:
if not defined apc goto :ende
echo j| reg add "\\%apc%\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v BufferPolicyReads /t REG_DWORD /d 1 >NUL || goto :pcs  
setlocal enabledelayedexpansion
>>%datei% echo !apc!
endlocal
goto :pcs

:ende
if exist "%Datei%" (  
    echo Žnderungen wurden erfolgreich vollzogen:
    type "%Datei%"  
) else (
    echo Keine Žnderungen vorgenommen!
)
pause
Willst Du zunächst nur die Rechnernamen sammeln, müsstest Du die Zeile 15 in einer "for /f"-Schleife, welche die erstellte Datei ausliest, platzieren; diese Schleife könnte entweder unmittelbar nach ":ende" oder in einem zweiten Batch stehen.

Grüße
bastla
Member: perseus21
perseus21 Mar 31, 2014 at 06:41:18 (UTC)
Goto Top
Bastla & Rubberman,
vielen Dank für eure schnelle und kompetente Hilfe. Jetzt funktioniert es so, wie ich es möchte.

Gruß
Dirk