Hallo MarkusH.,
hast Du das Batchfile selbst geschrieben oder ist das Programming by StackOverflow? Es enthält einige Merkwürdigkeiten, die den Verdacht nahelegen, dass Du nicht verstanden hast was Du tust.
Erste Frage ist: Du sagst, dass findstr eine Datei nicht findet. Im Gegensatz zu einigen anderen Kommentaren gehe ich davon aus, dass findstr selbst sehr wohl gefunden wird, das BAT aber das falsche Arbeitsverzeichnis hat. CMD-Prozesse aus Diensten werden gerne mit dem Windows-Ordner als aktuellem Verzeichnis gestartet, nicht dem Ordner, in dem das Batchfile liegt. Bekommst Du die Echos aus dem Batch zu sehen? Setz mal einen Befehl CD
an den Anfang. Oder wenn Du die Echos nicht zu sehen bekommst:
CD >C:\Users\markus\Desktop\server\script.log
.
Du wirst sicherlich zu Beginn in deinen Arbeits-Ordner wechseln müssen. Das kann man mit einer absoluten Verzeichnisangabe tun. Bei Dir ist es aber so, dass das Script selbst im Arbeitsordner liegt. Es wäre daher schick, wenn das Script einfach in "seinen" Ordner wechselt. Das geht, siehe unten.
Zweite Frage wäre: Warum liegt das Ganze in deinem Userprofil? Ein Server sollte in eigenen Bereichen hantieren; ich persönlich würde einen ganz eigenen Root-Ordner dafür anlegen. Wenn der Apache unter einem eigenen Account läuft, kannst Du diesen Ordner für diesen Account berechtigen und musst dem Apache nicht das Recht geben, dein Userprofil potenziell zu schreddern.
Dritte Frage ist: Woher hast Du diese seltsame set Syntax? Ich habe noch nie gesehen, dass alles hinter SET in Anführungszeichen gesetzt wird. Sowas bräuchtest Du - hab's grad mal probiert - dann, wenn Du Umgebungsvariablennamen verwenden willst, die Leerstellen enthalten. Das tust Du aber nicht. Du kannst die Anführungszeichen weglassen. Bei ECHO übrigens auch. ECHO würde die einfach mit ausgeben.
Vierte Frage ist: Was soll da eigentlich passieren? Du schreibst test hamacher
in die Textdatei, die vom Batch durchgelesen wird. Soll ein Ordner namens "test hamacher" entstehen? Es ist dann aber eigentlich nicht so gut, die Anführungszeichen, die der MD dafür braucht, in einer Variablen einzubauen. Das ginge einfacher mit
MD "%name%"
Fünfte Frage: Warum zählst Du erst und holst dann mühsam mit More Zeile für Zeile heraus, wobei Du dann noch dafür sorgen musst, nur die erste Ergebniszeile des More zu verarbeiten? Du hast Doch gar keine Notwendigkeit, die Anzahl der Zeilen vorher zu wissen. Das Ganze geht viel einfacher, wenn Du mit FOR /F einfach Zeile für Zeile verarbeitest.
Sechste Frage: Kennst Du XCOPY? Der kopiert und legt mit Option /i auch gleich den Zielordner an.
Also:
- Arbeitsordner aktivieren (CD)
- Variablen initialisieren
- FOR /F Schleife über alle Zeilen laufen lassen
- Je Durchlauf die Vorlage auf das Zielverzeichnis kopieren - XCOPY macht alles allein. ECHO und Zähler sind für den Spaß noch dabei.
- Abschlussmeldung und fertig.
cd /D %~dp0
set /a counter=0
for /f "delims=" %%a in (adminnames.txt) do (
xcopy vorlage "%%a" /s /e /i
echo Ordner: %%a erstellt
set /a counter=counter+1
)
echo Es wurden %counter% Ordner erstellt!
echo adminnames.txt wird gelöscht...
del adminnames.txt
echo Fertig
Fertig. Das ist eigentlich das ganze Batchfile. Und ja, direkt aus PHP heraus geht das sicherlich auch.
Der %~dp0 Klops verwendet gleich zwei Batchtricks. Trick 1: Der Parameter %0 enthält immer den Namen des laufenden Batchfiles. Trick 2: Mit %~ kann man Namensteile von Dateien aus Parametern holen. Das wird in der Hilfe von for für FOR-Variablen erklärt, funktioniert aber auch mit Batch-Parametern. Gib mal auf einer Kommandozeile help for
ein, die Erklärung ist ziemlich am Schluss. %~dp0 bedeutet: Ich möchte von dem Dateinamen in %0 bitte Laufwerk und Pfad haben. Wenn %0 also C:\Users\markus\Desktop\server\server.bat
enthält, ist das Ergebnis von %~dp0 C:\Users\markus\Desktop\server\
. Immer mit abschließendem Backslash!
Rolf
sumpsi - posui - clusi