Schleife wird nicht ausgeführt und ein paar andere Kleinigkeiten
Hallo zusammen,
Ich hoffe Ihr könnt mir dabei helfen, ein wenig Licht ins Dunkel der Batchprogrammierung zu bringen
Hintergrund des Scriptes ist, dass ich unter Linux zur Sicherung künftig DAR (Disk Archiver) einsetzen will und die Archive künftig zur Not auch unter Window entpacken können will und das aus Bequemlichkeit per Kontextmenü bei einem Rechtsklick auf ein solches.
Dafür wird in der Registry ein entsprechender Aufruf eingebaut:
[HKEY_CURRENT_USER\Software\Classes\Disk Archiver Image File\shell\Extract to <directory>\command]
@="\"D:\\Work\\Tools\\DAR\\dar_extract.bat\" \"%1\""
(das ist jetzt natürlich nur der <command> Teil, den Rest habe ich aus Platzgründen weggelassen. Der Aufruf des Scriptes beim Rechtsklick auf ein .dar Archiv funktioniert auch soweit korrekt.
Kommen wir zum Script:
@echo off
set sComplete=%1
for %%i in ("%sComplete%") do set sPathOnly=%%~di%%~pi
for %%i in ("%sComplete%") do set sFileNameFull=%%~ni%%~xi
for /F "delims=. tokens=1" %%i in ("%sFileNameFull%") do set sFileNameShort=%%i
REM echo sPathOnly="%sPathOnly%"
REM echo sFileNameFull="%sFileNameFull%"
REM echo sFileNameShort="%sFileNameShort%"
@rem D:\Work\Tools\DAR\glftpd_full.1.dar
@rem > /cygdrive/d/work/tools/dar/
set linPath1=%sPathOnly:\=/%
echo linPath1=%linPath1%
set linPath2=%linPath1::=%
echo linPath2=%linPath1%
@mkdir %sFileNameShort%
@rem "D:\Work\Tools\DAR\DAR.exe" -R ./ -v -w -O -x %sFileNameShort%"
---
Wenn ich einen Command Prompt mit aktivem Verzeichnis in D:\Work\Tools\DAR offen habe und das Script manuell ausführe (mit dar_extract.bat D:\Work\Tools\DAR\glftpd_full.1.dar) läuft es durch. Wenn ich es allerdings über das Kontextmenü beim Klick auf die Datei ausführe kommt es nur bis zur zweiten for Schleife.
for /F "delims=. tokens=1" %%i in ("%sFileNameFull%") do set sFileNameShort=%%i
Wird schon nicht mehr ausgeführt (getestet mit pause um zu sehen bis wo er kommt). Warum mag er die Zeile nicht und wie ändere ich sie?
Als zweites würde ich gerne wissen, wie ich die Variable sPathOnly (die beim manuellen Aufruf "D:/Work/Tools/DAR/" beinhaltet auf das Format umschreibe, was DAR voraussetzt ("/cygdrive/d/work/tools/dar/"). Meine erste Umwandlung der Backslashes in Slashes (set linPath1=%sPathOnly:\=/%) funktioniert ja noch, danach geht aber nicht mehr viel (die nächste Zeile scheitert beim Entfernen des Doppelpunktes im Pfad).
Wenn der Pfad korrekt umgeschrieben worden ist, würde ich ihn in der letzten Zeile als Variable (sPathOnly + sFileNameShort anstatt des ./ verwenden und dann das eigentlichen Entpacken damit "freischalten"... Das -x %sFileNameShort% in der Zeile setzt voraus, dass das Verzeichnis bereits existiert, weshalb auch vorher das mkdir dafür aufgerufen wird.
Das Ganze unter Windows XP (Pro).
Vielleicht hat ja jemand ein paar Hilfestellungen für mich oder auch Vorschläge, wie man so etwas intelligenter (schäm ) angehen könnte?
LG,
Highend01
Ich hoffe Ihr könnt mir dabei helfen, ein wenig Licht ins Dunkel der Batchprogrammierung zu bringen
Hintergrund des Scriptes ist, dass ich unter Linux zur Sicherung künftig DAR (Disk Archiver) einsetzen will und die Archive künftig zur Not auch unter Window entpacken können will und das aus Bequemlichkeit per Kontextmenü bei einem Rechtsklick auf ein solches.
Dafür wird in der Registry ein entsprechender Aufruf eingebaut:
[HKEY_CURRENT_USER\Software\Classes\Disk Archiver Image File\shell\Extract to <directory>\command]
@="\"D:\\Work\\Tools\\DAR\\dar_extract.bat\" \"%1\""
(das ist jetzt natürlich nur der <command> Teil, den Rest habe ich aus Platzgründen weggelassen. Der Aufruf des Scriptes beim Rechtsklick auf ein .dar Archiv funktioniert auch soweit korrekt.
Kommen wir zum Script:
@echo off
set sComplete=%1
for %%i in ("%sComplete%") do set sPathOnly=%%~di%%~pi
for %%i in ("%sComplete%") do set sFileNameFull=%%~ni%%~xi
for /F "delims=. tokens=1" %%i in ("%sFileNameFull%") do set sFileNameShort=%%i
REM echo sPathOnly="%sPathOnly%"
REM echo sFileNameFull="%sFileNameFull%"
REM echo sFileNameShort="%sFileNameShort%"
@rem D:\Work\Tools\DAR\glftpd_full.1.dar
@rem > /cygdrive/d/work/tools/dar/
set linPath1=%sPathOnly:\=/%
echo linPath1=%linPath1%
set linPath2=%linPath1::=%
echo linPath2=%linPath1%
@mkdir %sFileNameShort%
@rem "D:\Work\Tools\DAR\DAR.exe" -R ./ -v -w -O -x %sFileNameShort%"
---
Wenn ich einen Command Prompt mit aktivem Verzeichnis in D:\Work\Tools\DAR offen habe und das Script manuell ausführe (mit dar_extract.bat D:\Work\Tools\DAR\glftpd_full.1.dar) läuft es durch. Wenn ich es allerdings über das Kontextmenü beim Klick auf die Datei ausführe kommt es nur bis zur zweiten for Schleife.
for /F "delims=. tokens=1" %%i in ("%sFileNameFull%") do set sFileNameShort=%%i
Wird schon nicht mehr ausgeführt (getestet mit pause um zu sehen bis wo er kommt). Warum mag er die Zeile nicht und wie ändere ich sie?
Als zweites würde ich gerne wissen, wie ich die Variable sPathOnly (die beim manuellen Aufruf "D:/Work/Tools/DAR/" beinhaltet auf das Format umschreibe, was DAR voraussetzt ("/cygdrive/d/work/tools/dar/"). Meine erste Umwandlung der Backslashes in Slashes (set linPath1=%sPathOnly:\=/%) funktioniert ja noch, danach geht aber nicht mehr viel (die nächste Zeile scheitert beim Entfernen des Doppelpunktes im Pfad).
Wenn der Pfad korrekt umgeschrieben worden ist, würde ich ihn in der letzten Zeile als Variable (sPathOnly + sFileNameShort anstatt des ./ verwenden und dann das eigentlichen Entpacken damit "freischalten"... Das -x %sFileNameShort% in der Zeile setzt voraus, dass das Verzeichnis bereits existiert, weshalb auch vorher das mkdir dafür aufgerufen wird.
Das Ganze unter Windows XP (Pro).
Vielleicht hat ja jemand ein paar Hilfestellungen für mich oder auch Vorschläge, wie man so etwas intelligenter (schäm ) angehen könnte?
LG,
Highend01
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 67603
Url: https://administrator.de/contentid/67603
Ausgedruckt am: 18.12.2024 um 19:12 Uhr
7 Kommentare
Neuester Kommentar
Moin Highend01,
willkommen im Forum.
Den Anfang kann ich ja machen...
Bitte ändere in der Registry:
>[HKEY_CURRENT_USER\Software\Classes\Disk Archiver Image File\shell\Extract to <directory>\command]
>@="\"D:\\Work\\Tools\\DAR\\dar_extract.bat\" \"%L\""
Im Script:
[Ungetestete Skizze]
Zum unteren Teil kommen wir, wenn der obere Part soweit fliegt.
Grüße
Biber,
dessen Becks wartet...
willkommen im Forum.
Den Anfang kann ich ja machen...
Bitte ändere in der Registry:
>[HKEY_CURRENT_USER\Software\Classes\Disk Archiver Image File\shell\Extract to <directory>\command]
>@="\"D:\\Work\\Tools\\DAR\\dar_extract.bat\" \"%L\""
Im Script:
@echo off & setlocal
REM set sComplete=%1
@echo Just for test: [%*]
for %%i in (%*) do set "sPathOnly=%%~dpi"
for %%i in (%*) do set "sFileNameFull=%%~nxi"
...
REM ..... hier erstmal "Pause"
Echo Debug sPathonly: [%sPathOnly%] sFileNameFull: [%sFileNameFull%]
pause
goto :eof
for /F "delims=. tokens=1" %%i in ("%sFileNameFull%") do set sFileNameShort=%%i
Zum unteren Teil kommen wir, wenn der obere Part soweit fliegt.
Grüße
Biber,
dessen Becks wartet...
Moin Highend01,
<OT>
ich hatte auch nichts davon geschrieben, dass ich müde wäre oder sofort schlafen wollte...
</OT>
Verbesserungsorschläge bzw. Anmerkungen:
Grüße
Biber
<OT>
ich hatte auch nichts davon geschrieben, dass ich müde wäre oder sofort schlafen wollte...
</OT>
Verbesserungsorschläge bzw. Anmerkungen:
- Ich habe Deinen Code in entsprechende Code-Tags gesetzt. Möglichkeiten siehe unter "Häüfige Fragen - Formatierungshilfen".
- Bei den SET-Zuweisungen, bei denen ich immer die Set-Anweisung incl. Variablen in Anführungszeichen setze, muss ich dazu sagen: Das ist eine persönliche Vorliebe von mir, von M$ weder dokumentiert noch empfohlen. Siehe Hilfe von SET (Set /?).
- Das Setzen der %~ni, %~xi...-Parameter kann auf jeden Fall etwas verkürzt werden. Siehe unten.
- Und wenn gewährleitet WÄRE, dass nur ein Parameter ankommt, wäre es ganz ohne FOR-Konstrukt machbar ( set "sPathOnlyOld=%~p1"). Ich würde allerdings vor dieser Vereinfachung auf jeden Fall testen, ob es dann auch mit Parametern wie "Y:\Eigene Dateien\xy.abc" klappt, also mit Dateien, die Leerzeichen im Pfad/Namen haben.
- bei dem sFileNameShortOld musst Du wissen, welche Konvention Du einbauen willst - entweder den "Dateinamen ohne Endung" oder den" Dateinamen bis zum ersten Punkt von links gesehen". Da ist von der ersten Version zur jetzigen ein kleine Unterschiedlichkeit.
@echo off & setlocal
REM Anfangsvariablen setzen
set DAR="D:\Work\Tools\DAR\DAR.exe"
set "Cygdrive=/cygdrive/"
::echo Just for test: [%*]
REM %* in seine Bestandteile aufsplitten
for %%i in (%*) do (
set "sPathOnlyOld=%%~pi"
set "sPathFull=%%~dpi"
set "sFileNameFull=%%~nxi"
set "sFileNameShortOld=%%~ni"
set "sDriveLetterOld=%%~di"
)
REM Pfade / Namen in den Variablen ersetzen
set sPathOnly=%sPathOnlyOld:\=/%
set sDriveLetter=%sDriveLetterOld:~0,-1%
set sFileNameShort=%sFileNameShortOld:~0,-2%
REM Outputs für Debugzwecke
::Echo Debug sPathOnly: [%sPathOnly%] sPathFull: [%sPathFull%]
::Echo Debug sFileNameFull: [%sFileNameFull%]
::Echo Debug sFileNameShort: [%sFileNameShort%] sDriveLetter: [%sDriveLetter%]
REM Variable für den auf Linux Art umgeschriebenen Pfad setzen
set linPath=%Cygdrive%%sDriveLetter%%sPathOnly%%sFileNameShort%
REM Verzeichnis erstellen und entpacken
mkdir "%sPathFull%%sFileNameShort%"
%DAR% -R %linPath% -w -O -x %sFileNameShort%
Grüße
Biber
Moin Highend01,
zu den verbleibenden Sonderfällen:
Da kommt uns ein zugesichertes M$-Feature zugute - die Implementierung der CMD-Funktionalität ist genauso strohdoof wie der Rest.
Bedeutet, wenn ein -ich sag mal volkstümlich- Textparameter durch den %~dpnx-Variablenauflösungsprozess gejagt wird, dann ergibt sich:
> wenn der Parameter %~di == Drive bei Dir als "\\" ankommt, dann liegt dort "\\" vor.
> If [%sDriveLetterOld%]=="\\" set "sDriveLetterOld=\\\\"
Falls Du allerdings diesen UNC-Path noch nicht vorliegen hast, sondern erst auflösen musst, dann suche mal mit der Forumssuche nach "UNC-Pfad" oder "UNCpath.vbs".
Damit wird dann z.b. aus einem Netz-File "W:\Dokus\abc.text" das UNC-File "\\xxserver\yyshare\Dokus\abc.text" rekonstruiert.
Das wäre mit native Batch zu umständlich und zu unsauber, da sollte ein VBS-Schnipsel rein.
Ich würde an dieser Stelle (Windows-Namenskonventionen sicherstellen) eigentlich so vorgehen, dass der Gesamt-FullQualifiedFilename getrennt wird in einen Laufwerks/Drive-Part ("\\" bzw: "C:" etc.) und einen Part "%~pnxi" ==RestOhneDrive.
Und im RestOhneDrive kannst Du wie oben alle ":" durch "_" usw. ersetzen wie Du wutt.
Und erst danach zerlegst Du den Gesamtstring "%drive%%RestOhneDriveNachbehandelt%" in diese Pfad-, Name-, Extension-Bestandteile.
Grüße
Biber
zu den verbleibenden Sonderfällen:
- >Wenn man allerdings ein Archiv wählt, das auf einem Samba Share liegt, dann muss die Notation für den Pfad auf diese Weise umgesetzt werden: \\host\file\path -> \\\\host/file/path.
Da kommt uns ein zugesichertes M$-Feature zugute - die Implementierung der CMD-Funktionalität ist genauso strohdoof wie der Rest.
Bedeutet, wenn ein -ich sag mal volkstümlich- Textparameter durch den %~dpnx-Variablenauflösungsprozess gejagt wird, dann ergibt sich:
Z:\>
$cmd$for /f %i in ("\\xxserver\yyshare\test.abc") do @echo [Drive:%~di] [Path:%~pi] [File:%~nxi]
[Drive:\\] [Path:xxserver\yyshare\] [File:test.abc]
> If [%sDriveLetterOld%]=="\\" set "sDriveLetterOld=\\\\"
Falls Du allerdings diesen UNC-Path noch nicht vorliegen hast, sondern erst auflösen musst, dann suche mal mit der Forumssuche nach "UNC-Pfad" oder "UNCpath.vbs".
Damit wird dann z.b. aus einem Netz-File "W:\Dokus\abc.text" das UNC-File "\\xxserver\yyshare\Dokus\abc.text" rekonstruiert.
Das wäre mit native Batch zu umständlich und zu unsauber, da sollte ein VBS-Schnipsel rein.
- >Windows mag ja keine Doppelpunkte in Pfaden oder Dateinamen...
Ich würde an dieser Stelle (Windows-Namenskonventionen sicherstellen) eigentlich so vorgehen, dass der Gesamt-FullQualifiedFilename getrennt wird in einen Laufwerks/Drive-Part ("\\" bzw: "C:" etc.) und einen Part "%~pnxi" ==RestOhneDrive.
Und im RestOhneDrive kannst Du wie oben alle ":" durch "_" usw. ersetzen wie Du wutt.
Und erst danach zerlegst Du den Gesamtstring "%drive%%RestOhneDriveNachbehandelt%" in diese Pfad-, Name-, Extension-Bestandteile.
Grüße
Biber