FOR-Schleife funktioniert nicht
#1
geschrieben 05. Mai 2022 - 11:23
ich bin am verzweifeln.....
ich versuche gerade einen Backup-Job zu schreiben.
Bevor das Backup über Robocopy startet, sollen alle angeschlossenen Laufwerke auf eine bestimmte Datei durchsucht werden. damit das Backup immer auf das richtige Laufwerk geschrieben wird (Wechseldatenträger).
Um das zu prüfen, schreibe ich zuerst über wmic logicaldisk get deviceid die DeviceID´s in eine Textdatei.
über eine FOR-Schleife wollte ich dann die einzelnen ID´s in ein Array schreiben um diese dann über eine weitere Schleife zu prüfen.
jetzt habe ich das Problem das die FOR-Schleife die Zeilen aus der Textdatei nicht ausliest. Ich finde den Fehler aber nicht.
Code sieht so aus (echo um zu sehen was er ausliest..):
for /F "tokens=* skip=1" %%i in (C:\Users\Public\Desktop\einlesen.txt) do echo %%i
Txt sieht so aus
DeviceID
C:
E:
F:
H:
I:
J:
K:
R:
U:
Vielen Dank
Gruß
Anzeige
#2
geschrieben 05. Mai 2022 - 12:22
D:\temp>test.cmd C: E: F: H: I: J: K: R: U: D:\temp>
---
Ich bin ein kleiner, schnickeldischnuckeliger Tiger aus dem Schwarzwald.
Alle haben mich ganz dolle lila lieb.
#3
geschrieben 05. Mai 2022 - 12:29
Es kommt keine Fehlermeldung es wird nur folgendes ausgespuckt:
C:\Users\Public\Desktop>pause
Drücken Sie eine beliebige Taste . . .
C:\Users\Public\Desktop>for /F "tokens=* skip=1" %i in (einlesen.txt) do echo %i
C:\Users\Public\Desktop>pause
Drücken Sie eine beliebige Taste . . .
Gruß
Kevin
#4
geschrieben 05. Mai 2022 - 12:44
---
Ich bin ein kleiner, schnickeldischnuckeliger Tiger aus dem Schwarzwald.
Alle haben mich ganz dolle lila lieb.
#5
geschrieben 05. Mai 2022 - 13:16
#6
geschrieben 05. Mai 2022 - 14:15
@echo off for /F "tokens=* skip=1" %%i in (einlesen.txt) do echo %%i
Und das klappt soweit. Es wird der Inhalt der .txt zeilenweise ausgegeben (bis auf Zeile 1).
---
Ich bin ein kleiner, schnickeldischnuckeliger Tiger aus dem Schwarzwald.
Alle haben mich ganz dolle lila lieb.
#7
geschrieben 06. Mai 2022 - 06:01
es scheint an der TXT zu liegen, wenn ich die TXT selber schreibe führt er die Schleife aus. Wenn ich die TXT aber über wmic logicaldisk get deviceid erstelle geht es nicht.
Ich sehe so auch bei den Dateien keinen direkten unterschied.... außer das er bei der aus cmd erstellten Leerzeichen einfügt welche aber ja durch "tokens=*" ignoriert werden sollten. Aber selbst wenn ich die Weg mache geht es nicht.....
hast du eine Idee?
Gruß
Kevin
#8
geschrieben 06. Mai 2022 - 11:13
jetzt habe ich aber das nächste Problem..... ich möchte das die Existierenden DeviceID´s in ein Array geschrieben werden.
versucht habe ich es so:
REM Ausgabe der existierenden DeviceID´s ECHO OFF FOR %%i IN (\'A B C D E F G H I J K L M N O P Q R S T U V W X Y Z\') DO IF EXIST %%i:\\\\ echo Laufwerk %%i:\\\\ existiert. PAUSE EXIT set n=0 REM Existierende DeviceID´s in Array übergeben FOR %%i IN (\'A B C D E F G H I J K L M N O P Q R S T U V W X Y Z\') DO ( IF EXIST %%i:\\\\ ( set LaufArr[!n!] = %%i set /A n+=1 )) REM Kontrolle ob Anzahl stimmt echo %n% pause REM Array ausgeben FOR %%a IN (%LaufArr%) do ( echo %%a ) PAUSE EXIT
Er schreibt aber nichts in das Array glaube ich jedenfalls da er nichts ausgibt auch nicht wenn ich einen einzelnen Array Eintrag z.B. [0] ausgeben will. Was mache ich falsch?
Gruß
Kevin
#9
geschrieben 06. Mai 2022 - 13:02
@echo off setlocal EnableDelayedExpansion set /a n=0 for %%i in (A B C D E F G H I J K L M N O P Q R S T U V W X Y Z) do ( if exist %%i:\ ( set LaufArr[!n!]=%%i set /A n+=1 ) ) echo. echo %n% Elemete im Array echo. set /a n-=1 for /l %%i in (0,1,!n!) do ( echo !LaufArr[%%i]! ) echo. pause exit
Und das er Deine Textdatei nicht einlesen konnte, liegt an der Kodierung. Die muss UTF-8 sein. Die Konsole erstellt aber eine Datei mit UTF-16 LE BOM. Das kann die cmd nicht einlesen.
---
Ich bin ein kleiner, schnickeldischnuckeliger Tiger aus dem Schwarzwald.
Alle haben mich ganz dolle lila lieb.
#11
geschrieben 06. Mai 2022 - 22:51
Zitat (stRavin: 06. Mai 2022 - 06:01)
es scheint an der TXT zu liegen, wenn ich die TXT selber schreibe führt er die Schleife aus. Wenn ich die TXT aber über wmic logicaldisk get deviceid erstelle geht es nicht.
wie DK schon schrieb liefert wmic die 'falsche' codierung, um das zu umgehen muesstest du den output pipen, z.b. so:
wmic logicaldisk get deviceid | find /v "" > output.txt
#12
geschrieben 16. Mai 2022 - 11:07
nochmal Danke für die ganzen Antworten.
Ich habe wieder eine Frage...
Das Script schreibt mir jetzt die vorhandenen Laufwerke in ein Array und gibt mir diese aus, das funktioniert einwandfrei vielen Dank dafür!
jetzt möchte ich das er die vorhandenen Laufwerke aus dem Array auf eine Datei "Token.txt" überprüft und wenn die Datei vorhanden ist via Robocopy das Backup dort ausführt.
ich habe es wie folgt versucht:
for %%r in (LaufArr[!n!]) do ( if Exist %%r:\Token.txt ( set Path=%%r else goto Fehler ) )
leider ohne Erfolg. (Es wird einfach nur übersprungen bzw. wird einfach der Code ausgegeben)
Ich muss Zugeben das ich nicht viel Erfahrung mit Scripten habe und so meine Probleme damit habe..... Ich Programmiere normalerweise in VBA, Python oder C#.
könnt ihr mir nochmal helfen?
Gruß
Kevin
PS.:
Ich versuch den Laufwerkbuchstaben des Laufwerkes auf welchem sich die Datei in eine Variable zu Speichern um das Später mehrfach verwenden zu können.
Gruß
Kevin