mc-doubleyou
Goto Top

FOR Variable nur letzter Ordner

Hallo zusammen,

ich möchte mit PneumaticTube Daten auf meine Dropbox laden.
Der Programmierer hat mir dann vorgeschlagen ich soll es mittels for Schleife machen, allerdings war es noch sehr unausgegoren.

Ich stocke aber dabei die FOR Variable auf den letzen Ordner zu beschränken.

Hier mal mein bisheriger Ansatz

@echo off
setlocal enabledelayedexpansion

set plex_dir=C:\SecureWAMP\htdocs\plex\
set path=C:\SecureWAMP\htdocs\plex\plex-data\

echo %plex_dir%>%temp%/lenvar.tmp
for %%i in ("%temp%\lenvar.tmp") do set /a lenvar=%%~zi-2  


for /r %plex_dir% %%a in ("*") do C:\portApps\PneumaticTube\PneumaticTube.exe -f %~fa -p \Apps\Pancake.io\medya\!path:~%lenvar%!  

Allerdings passt die %path% variable nicht, ich müsste eigentlich %~dpa um %lenvar% kürzen, sowas wie !~dpa:~%lenvar%

Gibts da eine Lösung?
Danke!

LG mcdy

Content-ID: 278527

Url: https://administrator.de/forum/for-variable-nur-letzter-ordner-278527.html

Ausgedruckt am: 22.12.2024 um 17:12 Uhr

bastla
Lösung bastla 28.07.2015 aktualisiert um 09:38:32 Uhr
Goto Top
Hallo mc-doubleyou!

Soferne ich das richtig verstehe, willst Du einen Pfad wie "C:\SecureWAMP\htdocs\plex\plex-data\Unterordner\UnterUnterordner\" auf "Unterordner\UnterUnterordner\" reduzieren - falls ja, etwa so:
@echo off & setlocal enabledelayedexpansion

set "plex_dir=C:\SecureWAMP\htdocs\plex\"  
set "plex_path=C:\SecureWAMP\htdocs\plex\plex-data\"  

for /r %plex_dir% %%a in ("*") do (  
    set "FullPath=%%~dpa"  
    set "RelPath=!FullPath:%plex_path%=!"  
    echo C:\portApps\PneumaticTube\PneumaticTube.exe -f "%%~fa" -p "\Apps\Pancake.io\medya\!RelPath!"  
)
pause
Falls der Backslash am Ende stören sollte, kannst Du alternativ
    echo C:\portApps\PneumaticTube\PneumaticTube.exe -f "%%~fa" -p "\Apps\Pancake.io\medya\!RelPath:~,-1!"
verwenden.

Das echo in Zeile 9 sowie die Zeile 11 dienen zum Testen - wenn die ausgegebenen Befehle vernünftig aussehen, kannst Du beide weglassen ...

BTW: %path% solltest Du in einem Batch nur verändern, wenn Du weißt, was Du tust - daher habe ich ersatzweise %plex_path% verwendet ...

Grüße
bastla
mc-doubleyou
mc-doubleyou 28.07.2015 aktualisiert um 09:40:05 Uhr
Goto Top
Hallo bastla,

Cool, danke! Nur der Vollständigkeit halber, so war es eigentlich gemeint ;)

@echo off & setlocal enabledelayedexpansion

set "plex_dir=C:\SecureWAMP\htdocs\plex\"  

for /r %plex_dir% %%a in ("*") do (  
    set "FullPath=%%~dpa"  
    set "RelPath=!FullPath:%plex_dir%=!"  
    C:\portApps\PneumaticTube\PneumaticTube.exe -f "%%~fa" -p "\Apps\Pancake.io\medya\!RelPath!"  
)

Also den FullPath um den Teil kürzen der nur lokal, aber nicht auf der Dropbox existert.
Ich konnte den vollen Funktionsumfang noch nicht testen, hoffe aber sollte beim RelPath nichts raus kommen wird das richtig verarbeitet, den es gibt auch ein paar Dateien direkt im plex Ordner.

Fällt dann schon unter Luxus, aber euch trau ich es zu. Gibt es auch eine Möglichkeit Dateien auszunehmen?

Achja ich hab es zwar getestet, aber versteh es noch nicht, kann mir bitte wer erklären warum das mit der RelPath Variable funktioniert?

set etc_dir=C:\Windows\System32\drivers\etc

echo %etc_dir:C:\Windows=%
Ausgabe: \System32\drivers\etc


Thx & LG mcdy
bastla
bastla 28.07.2015 aktualisiert um 11:57:42 Uhr
Goto Top
Hallo mc-doubleyou!
... warum das mit der RelPath Variable funktioniert?
Dafür wird die "Ersetzen"-Funktionalität von set verwendet - aus der Onlinehilfe:
Das Ersetzen von Umgebungsvariablen wurde folgendermaßen erweitert:

    %PATH:str1=str2%

Dies erweitert die PATH-Umgebungsvariable, wobei jede Instanz von "str1" im
erweiterten Ergebnis mit "str2" ersetzt wird. "str2" kann die leere
Zeichenfolge sein, um alle Instanzen von "str1" aus der erweiterten Ausgabe zu
löschen. Wenn "str1" mit einem Sternchen beginnt, steht "str1" für alles
zwischen dem Anfang der erweiterten Ausgabe bis zum ersten Auftreten des
übrigen Abschnitts von "str1".
Gibt es auch eine Möglichkeit Dateien auszunehmen?
Nach welchen Kriterien?

Grüße
bastla
mc-doubleyou
mc-doubleyou 29.07.2015 um 13:32:08 Uhr
Goto Top
Hallo bastla,

erstmal danke für die Erklärung, es ist immer schön wenn etwas funktioniert, aber wieder verwenden kann ich es nur wenn ich auch weiß warum.

Ich würde gerne folgende Dateien nicht verarbeiten, weil die auf der Dropbox nichts zu suchen haben, ist aber nur Optimierung, eigentlich funktioniert es schon jetzt sehr gut. [cli.php, README]
Nur für den Fall der Fälle wäre es auch interessant wie ich verhindern kann, dass ein bestimmter Ordner samt Inhalt verarbeitet wird.

Wie gesagt ab jetzt ist es Kür, das wirklich wichtige dürfte erledigt sein.

Danke!

LG mcdy
Biber
Biber 29.07.2015 aktualisiert um 14:21:54 Uhr
Goto Top
Moin mc-doubleyou,

zu deinem Kür-Teil der Anforderung....

Wenn du bestimmte Dateinamen von der Verarbeitung ausnehmen willst - es gibt ja eine Stelle in dem breitgekloppten Oneliner, in dem du den Vergleichswert "Dateiname" schon in der Hand hast. Nämlich nach der Klammer-Auf der FOR/F-Anweisung.
Da kannst du nich eine IF-Anweisung unterbringen.

Ungetestet:

@echo off & setlocal enabledelayedexpansion

set "plex_dir=C:\SecureWAMP\htdocs\plex\"  
Set "ausnahmen=cli.php README .jpg"  

for /r %plex_dir% %%a in ("*") do (  

    echo %ausnahmen%|findstr /i /v "%%a">nul && (  
    set "FullPath=%%~dpa"  
    set "RelPath=!FullPath:%plex_dir%=!"  
    C:\portApps\PneumaticTube\PneumaticTube.exe -f "%%~fa" -p "\Apps\Pancake.io\medya\!RelPath!"  
)
)

Bewirkt: Nur wenn der Dateiname nicht in %ausnahmen% gefunden wird, werden die drei eigentlichen Nutzzeilen in der FOR-Anweisung ausgeführt.

Geht sicherlich eleganter/lesbarer, aber für diese eine Sonderlocke sollte es reichen.

Grüße
Biber
bastla
bastla 29.07.2015 um 19:35:55 Uhr
Goto Top
... wobei sich eher ein Vergleich mit "%%~na" oder "%%~nxa" oder, für den Dateityp, "%%~xa" anbieten würde ...

Wenn's nur um einen Ordner ginge, dann auch umgekehrt:
echo "!RelPath!"|findstr /iv "\\Bestimmter Ordner\\">nul && (
Grüße
bastla