99046
Goto Top

Parameter-Check in verschachtelter FOR-Schleife

Hallo zusammen,
ich habe ein WinXP-Backup-Script, hier der Teil, der das USB-Laufwerk finden soll:
@echo off & setlocal EnableDelayedExpansion 
set LW= 

::	dies:
for /f %%a in ('fsutil fsinfo drives^|find ":"') do for /f "delims=\" %%i in ('fsutil fsinfo drivetype %%a^|find "Austauschbar"') do echo %%i  
::	... zeigt mir korrekt alle austauschbaren LW, 
::	incl. Wechseldatenträgerlaufwerke + USB-LW

::	dies ( Problem 1 ):
for /f %%a in ('fsutil fsinfo drives^|find ":"') do for /f "delims=\" %%i in ('fsutil fsinfo drivetype %%a^|find "Austauschbar"') do if exist %%i:\Kennung.dat set LW=%%i  
::	... bringt pro Wechseldatenträgerlaufwerk-Zugriff einen Windows Fehler.

::	also versuche ich:  
for /f %%a in ('fsutil fsinfo drives^|find ":"') do for /f "delims=\" %%i in ('fsutil fsinfo volumeinfo %%a^|find "Volumename"') do If /i %%i=="Volumename : xxxUSBxxx" echo "YES"  

::	Stick ist entsprechend benannt   - aber der letzte Teil ist fehlerhaft:
::	Abfrage, ob %%i "usb" enthält ...  ( Problem 2 )  
do If /i %%i=="Volumename : xxUSBxx" echo "YES"  
if not defined LW echo Laufwerk nicht erkannt! & goto :eof 
echo Laufwerk gefunden: %LW%

Die Lösungen unter:

helfen mir hier nicht weiter. ( "set LW=%~d0" ist klasse ! )

Hat jemand einen Tip, wie ich Problem 1 + gerne auch 2 lösen kann ?
Wäre klasse.

Vielen Dank !
Rob

Content-Key: 163977

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

Ausgedruckt am: 29.03.2024 um 09:03 Uhr

Mitglied: pieh-ejdsch
pieh-ejdsch 05.04.2011 um 13:26:37 Uhr
Goto Top
moin robo400,

Dein Ansatz ist schon gut, nur die Zerlegung der Ausgabe der Einzelnen Ergebnisse für die Forschleife passt nicht ganz.

for /f "tokens=1*" %%a in ('fsutil fsinfo drives') do (  
  for %%c in (%%b) do (
    for /f "tokens=1* delims=:" %%i in ('fsutil fsinfo drivetype %%c'') do @echo "%%i"|find "Austauschbar" >nul && echo %%j  
) )

[edit]
etwas mehr %%b und %%c reingeschrieben ...
[/edit]


Gruß Phil
Mitglied: 99045
99045 05.04.2011 um 13:40:25 Uhr
Goto Top
Moin ph,

wenn du die Fehler in deinem Beispiel beseitigst, wird eventuell ein Schuh draus. face-smile
Mitglied: pieh-ejdsch
pieh-ejdsch 05.04.2011 um 14:35:04 Uhr
Goto Top
jo schon verbessert.
vorhins war noch ein Stiefel face-smile

Gruß Phil
Mitglied: 99045
99045 05.04.2011 um 15:05:32 Uhr
Goto Top
Leider ist es immer noch ein Stiefel und funktioniert nur unter Win7. Unter XP erfolgt die Ausgabe von fsutil fsinfo drives mit einem Nullbyte hinter jedem "\", daher wird nur das erste Tokenm nämlich "Laufwerk:" verarbeitet. Außerdem ist da in Zeile 3 immer noch ein Auslassungszeichen zuviel.
Und da unser Fragesteller ja wohl das Script unter XP benutzen möchte, kommt man nur mit einer Zeile 1
fsutil fsinfo drives | find ":\" > wasweissich.txt   
(oder so in etwa) zu Zuge, bevor man weitermacht.

Und da du damit angefangen hast, darfst du deine Lösung auch selbst vervollständigen. face-devilish
Mitglied: 99046
99046 05.04.2011 um 15:42:57 Uhr
Goto Top
Moin ph,
danke für Deine schnelle Reaktion !
Ich bastel daran die ganze Zeit rum, aber 'will noch nicht'.

mit dem code in Zeilen 4-7 meines 1. Postings bekomme ich korrekt alle austauschbaren LW incl. Wechseldatenträgerlaufwerke + USB-LW angezeigt.
mit:
for /f "tokens=1*" %%a in ('fsutil fsinfo drives') do (   
  for %%c in (%%b) do ( 
    for /f "tokens=1* delims=:" %%i in ('fsutil fsinfo drivetype %%c') do @echo "%%i"|find "Austauschbar" >nul && echo %%j ))  
oder:
for /f "tokens=1*" %%a in ('fsutil fsinfo drives') do (   
  for %%c in (%%b) do ( 
    for /f "tokens=1* delims=:" %%i in ('fsutil fsinfo drivetype %%c'') do @echo "%%i"|find "Austauschbar" >nul && echo %%j ))  
... passiert im Moment nichts - kein Output.
( Ist:
... drivetype %%c'')   
so von Dir beabsichtigt ? )

Hast Du noch 'n Tip ? Ich wäre sehr dankbar.

Gruß, Rob
Mitglied: pieh-ejdsch
pieh-ejdsch 06.04.2011 um 00:37:45 Uhr
Goto Top
Nee keine Absicht - schussselfehler ist ein Hochkomma zuviel.

Es gibt zwar noch so paar andere Möglichkeiten um den möglichen USB auszulesen über Bordmittel -> ohne das ein Fehler bei A:\ käme
Über eine InI auf dem USB mit "DIR" und den entprechenden Inhalt und DateiAttributen  
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 dir /b/a-shra-d "%%i:\USBDriveXYZ.ini" >nul 2>nul && findstr USBDriveXYZ "%%i:\USBDriveXYZ.ini" >nul 2>nul && set "BackupLW=%%i"  
echo %BackupLW%

und/oder Über die Größe des Laufwerkes
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 for /f %%j in ('chkdsk %%i:^|findstr Speicherplatz 2^>nul') do if %%j equ 15671296 set "BackupLW=%%i"  
echo %BackupLW%

etc..
Bei Kombinationen dieser Sachen kann mit Großer Sicherhiet davon ausgegangen werden das es das Richtige Laufwerk ist

so müsste es auch reichen
@echo off
set "Volumename=XXXUSBXX"  

set "BackupLW=Nicht gefunden"  
for /f "tokens=*" %%a in ('fsutil fsinfo drives^|more') do (  
  for %%c in (%%a) do echo "%%c"|findstr "\\">nul&& fsutil fsinfo drivetype %%c |more|findstr /b "Austauschbar" >nul&& fsutil fsinfo volumeinfo|more|findstr /b "Volumename"|Findstr "%Volumename%" >nul && Set "BackupLW=%%c"  
)
echo %BackupLW%
pause

Gruß Phil
Mitglied: 99045
99045 06.04.2011 um 02:15:06 Uhr
Goto Top
Alternativvorschlag: Warum nicht einfach nur nach dem Volumelabel suchen?

:: Laufwerk nach Volumelabel ermitteln

@echo off & setlocal enabledelayedexpansion
set Liste=
Set Checklabel=IRGENDWAS
set LW= nicht gefunden
for /F "skip=1" %%a in ('fsutil fsinfo drives ^| find ":\"') do set "Liste=!Liste! %%a"  

:: Laufwerksbuchstaben mit Backslash
rem @echo %liste%
:: hier dann z. B. evtl. den Drivetyp ermitteln

:: hiermit Volumelabel ermitteln
: Laufwerksbuchstaben ohne Backslash
Set Liste=%liste:\=%
@echo %liste%

for %%a in (%liste%) do for /f "tokens=6" %%l in ('vol %%a') do if "%%l"=="%CheckLabel%" set LW=%%a\ 2>nul  
@echo Backuplaufwerk %LW%

pause
Mitglied: 99046
99046 06.04.2011 um 11:36:35 Uhr
Goto Top
Danke für eure Unterstützung !

bin nah dran:
@echo off & setlocal enabledelayedexpansion
set Liste=
Set Checklabel=USB
set LW= nicht gefunden
for /F "skip=1" %%a in ('fsutil fsinfo drives ^| find ":\"') do set "Liste=!Liste! %%a"  

Set Liste=%liste:\=%
for %%a in (%liste%) do for /f "tokens=6" %%l in ('vol %%a') DO set "LABEL=%%l" && DO if "%LABEL:~0,3%"=="%CheckLabel%" set LW=%%a\ 2>nul  

echo. && @echo Backuplaufwerk %LW% && echo. && pause
Hier passt es noch nicht:
for %%a in (%liste%) do for /f "tokens=6" %%l in ('vol %%a') DO set "LABEL=%%l" && DO if "%LABEL:~0,3%"=="%CheckLabel%" set LW=%%a\ 2>nul  

Habt ihr noch n Tip ?
Danke !
Mitglied: 99045
99045 06.04.2011 um 11:58:35 Uhr
Goto Top
Ändere die Zeile
for %%a in (%liste%) do for /f "tokens=6" %%l in ('vol %%a') DO set "LABEL=%%l"  && DO if "%LABEL:~0,3%"=="%CheckLabel%" set LW=%%a\ 2>nul  

in

for %%a in (%liste%) do for /f "tokens=6" %%l in ('vol %%a') DO set "LABEL=%%l" & if "!LABEL:~0,3!"=="%CheckLabel%" set LW=%%a\ 2>nul  

LABEL ist auch ein Systembefehl, man sollte solche Namen nicht als Variablen und auch nicht als Sprungmarken verwenden, irgendwann führt das sicher mal zu Problemen.
Mitglied: 99046
99046 06.04.2011 um 12:20:27 Uhr
Goto Top
Klasse !
Jetzt passt es.

Noch mal Danke für eure prima Unterstützung -
und auch für den letzten Hinweis !

Gruß,
Rob