Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Batchscripts

Frage Entwicklung Batch & Shell

Mitglied: perseus21

perseus21 (Level 1) - Jetzt verbinden

18.03.2014 um 15:26 Uhr, 1707 Aufrufe, 6 Kommentare, 2 Danke

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
Mitglied: bastla
18.03.2014 um 16:35 Uhr
Hallo perseus21 und willkommen im Forum!

Ungetestet etwa so:
01.
@echo off & setlocal 
02.
set "Datei=D:\Deine Liste.txt" 
03.
 
04.
del "%Datei%" 2>nul 
05.
:Loop 
06.
set "Ein=" 
07.
set /p Ein=Bitte einen Rechnernamen eingeben oder nur ENTER für Ende der Eingabe:  
08.
if not defined Ein goto :EndeEingabe 
09.
setlocal enabledelayedexpansion 
10.
>>"%Datei%" echo !Ein! 
11.
endlocal 
12.
goto :Loop 
13.
 
14.
:EndeEingabe 
15.
cls 
16.
echo Eingegeben wurde: 
17.
type "%Datei%"
Grüße
bastla
Bitte warten ..
Mitglied: rubberman
18.03.2014, aktualisiert um 17:58 Uhr
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
Bitte warten ..
Mitglied: perseus21
19.03.2014 um 10:06 Uhr
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
Bitte warten ..
Mitglied: perseus21
19.03.2014 um 10:13 Uhr
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)
Bitte warten ..
Mitglied: bastla
19.03.2014 um 13:27 Uhr
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:
01.
echo off & setlocal 
02.
CLS 
03.
set "datei=\\Servername\Pfad\liste.txt" 
04.
del "%datei%" 2>NUL 
05.
echo; 
06.
echo >>> Unterbinden von extrem langen Anmeldezeiten bei Erstanmeldung an einem Win XP Rechner <<< 
07.
echo; 
08.
 
09.
echo Auf welchen Rechnern soll der Registry Wert gesetzt werden? 
10.
 
11.
:pcs 
12.
set "Ein=" ;von bastla übernommen 
13.
set /p apc=Computername: 
14.
if not defined apc goto :ende 
15.
echo j| reg add "\\%apc%\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v BufferPolicyReads /t REG_DWORD /d 1 >NUL || goto :pcs 
16.
setlocal enabledelayedexpansion 
17.
>>%datei% echo !apc! 
18.
endlocal 
19.
goto :pcs 
20.
 
21.
:ende 
22.
if exist "%Datei%" ( 
23.
    echo Žnderungen wurden erfolgreich vollzogen: 
24.
    type "%Datei%" 
25.
) else ( 
26.
    echo Keine Žnderungen vorgenommen! 
27.
28.
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
Bitte warten ..
Mitglied: perseus21
31.03.2014 um 08:41 Uhr
Bastla & Rubberman,
vielen Dank für eure schnelle und kompetente Hilfe. Jetzt funktioniert es so, wie ich es möchte.

Gruß
Dirk
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (20)

Frage von Xaero1982 zum Thema Microsoft ...

Outlook & Mail
gelöst Outlook 2010 findet ost datei nicht (19)

Frage von Floh21 zum Thema Outlook & Mail ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...

Festplatten, SSD, Raid
M.2 SSD wird nicht erkannt (14)

Frage von uridium69 zum Thema Festplatten, SSD, Raid ...