2016-09-27 3 views
0

Ich versuche, einen Teil aller Dateinamen (PDF-Dateien) im aktuellen Verzeichnis zu extrahieren.Extrahieren Sie einen bestimmten Teil aus einer Zeichenfolge (Dateiname) mit Batch-Datei

Die Länge der Dateinamen variiert mit Ausnahme des letzten Teils (datetime und extension), der immer 16 Zeichen lang ist. Der verbleibende Teil wird immer unterschiedlich lang sein. Selbst der Teil, den ich benötige, kann unterschiedliche Längen haben.

Ich versuchte mit lastIndexOf Funktion erhalten here.

Dateiname zB: academyo-nonpo- 2.582.365 -082416051750.pdf

ich den Abschnitt in Bold extrahieren möchten. Ich habe versucht, die letzten 17 Zeichen (dieser Teil hat immer eine feste Länge.) Zuerst und dann versucht, den letzten Index von '-' zu erhalten (da der erste Teil kann variable Zeichenlänge haben.) Und trim die Zeichen bis dahin Position, die den erforderlichen Teil des Dateinamens zurückgeben soll.

@echo off 
Setlocal enabledelayedexpansion 

For %%# in ("%~dp0\*.pdf") Do (
    Set "File=%%~nx#" 
    Set "File=!File:~0,-17!" 
    Set "lio2=" 
    @echo on 
    echo !File! 
    @echo off 
    call :lastindexof !File! - lio2 
    Set "File=!File:~%lio%!" 

) 

Pause&Exit 

:lastindexof [%1 - string ; %2 - find last index of ; %3 - if defined will store the result in variable with same name] 
@echo off 
setlocal enableDelayedExpansion 


set "str=%~1" 
set "p=!str:%~2=&echo.!" 
set "splitter=%~2" 

set LF=^ 


rem ** Two empty lines are required 
echo off 
for %%L in ("!LF!") DO (
    for /f "delims=" %%R in ("!splitter!") do ( 
     set "var=!str:%%R=%%L!" 
    ) 
) 

for /f delims^=^" %%P in ("!var!") DO ( 
    set "last_part=%%~P" 
) 

if "!last_part!" equ "" if "%~3" NEQ "" (
echo "not contained" >2 
endlocal 
set %~3=-1 
exit 
) else (
echo "not contained" >2 
endlocal 

set argv=original 
set $strLen=for /L %%n in (1 1 2) do if %%n==2 (%\n% 
     for /F "tokens=1,2 delims=, " %%1 in ("!argv!") do (%\n% 
     set "str=A!%%~2!"%\n% 
    echo -1 
) 
setlocal DisableDelayedExpansion 

set ^"\n=^^^%LF%%LF%^%LF%%LF%^^" 
     set "len=0"%\n% 
      for /l %%A in (12,-1,0) do (%\n% 
      set /a "len|=1<<%%A"%\n% 
      for %%B in (!len!) do if "!str:~%%B,1!"=="" set /a "len&=~1<<%%A"%\n% 
      )%\n% 
      for %%v in (!len!) do endlocal^&if "%%~b" neq "" (set "%%~1=%%v") else echo %%v%\n% 
    ) %\n% 
) ELSE setlocal enableDelayedExpansion ^& set argv=, 


%$strlen% strlen,str 
%$strlen% plen,last_part 
%$strlen% slen,splitter 

set /a lio=strlen-plen-slen 
endlocal & if "%~3" NEQ "" (set %~3=%lio%) else echo %lio% 
exit /b 

Die Referenz der Variablen an die Funktion als dritter Parameter übergeben scheint nicht den gewünschten Wert zurückkommen. Ich weiß nicht was hier falsch ist.

+0

Ist der Dateiname immer gleich aufgebaut? Soll der dritte Teil durch '-'s getrennt sein? – geisterfurz007

+0

@ geisterfurz007 Muss nicht unbedingt der 3. Teil sein, weshalb ich versuche die letzte Indexfunktion zu verwenden. – Ash

+0

Wird es immer die gleiche Länge haben? Und wird es ein '-' sicher danach geben? – geisterfurz007

Antwort

0

Um den Abschnitt in fett zu erhalten dann:

Beispiel #

@Echo Off 
SetLocal EnableDelayedExpansion 
For %%# in ("%~dp0*.pdf") Do (
    Set "File=%%~n#" 
    Set "File=!File:~-20,7!" 
    Echo=!File!%%~x#) 
Pause 

Okay, was ist?

@Echo Off 
SetLocal EnableDelayedExpansion 
For %%# in ("%~dp0*.pdf") Do (
    Set "File=%%~n#" 
    Set "File=!File:~,-13!" 
    Call :Sub "!File:-=\!%%~x#") 
Pause 
:Sub 
Echo=%~nx1 
+0

Der Dateiname muss nicht immer dieselbe Länge haben. Nur die am Ende angehängte Datetime kann immer eine feste Länge haben. Deshalb versuche ich hier den letzten Funktionsindex zu verwenden. – Ash

+0

korrigiert basierend auf Ihrem aktualisierten Kommentar – Compo

+0

Sie gehen davon aus, dass der Teil, den ich benötige, auch eine feste Länge haben wird, aber das ist hier nicht der Fall. – Ash

0

Werfen Sie einen Blick auf this answer. Der Gedanke besteht darin, zuerst die Anzahl der Token zu zählen (Sie müssen die Zeichenfolge vorher noch trimmen) und dann das letzte Token holen.

In der ersten Schleife, wo es "tokens=1*" sagt, müssen Sie es auf die folgende bearbeiten: "tokens=1* delims=-" und in der zweiten Schleife delims=- hinzufügen, nachdem %i% auch. Es sollte mit Ihrem Skript wie folgt insgesamt suchen werden:

@echo off 
SetLocal EnableDelayedExpansion 

For %%# in ("%~dp0\*.pdf") Do (
Set "File=%%~nx#" 
Set "File=!File:~0,-17!" 
Set "lio2=" 
@echo on 
echo !File! 
@echo off 
call:subfunction !File! - lio2 
Set "File=!File:~%lio%!" 
) 

:subfunction 
set var1=%1 
set var2=%var1% 
set i=0 

:loopprocess 
for /F "tokens=1* delims=-" %%A in ("%var1%") do (
    set /A i+=1 
    set var1=%%B 
    goto loopprocess) 

for /F "tokens=%i% delims=-" %%G in ("%var2%") do set last=%%G 

echo %last% 
    REM do what you want with last here! 

ich es getestet und es scheint richtig, auch mit so etwas wie ac-ade-myo-n-on-po-15482729242321654-082416051750.pdf zu arbeiten, aber nach korrekter Beendigung es einer Fehlermeldung einmal mit einer Syntax geben Fehler konnte ich nicht finden ...

Wenn Sie diesen Fehler ignorieren können (alles andere funktioniert), könnte dies helfen.

+0

Danke, ich werde es überprüfen. – Ash

+0

Das funktioniert, aber nicht so, wie ich es erwartet hatte. Ich muss es mit gleich 1000-2000 Dateien auf einmal verwenden. Drücken einer Taste nach jeder Datei ist nicht möglich. Der Fehler ist jedoch in Ordnung. – Ash

+0

Oh Entschuldigung! Entfernen Sie die "Pause" aus dem Skript. Ich habe es zum Testen von Problemen verwendet. Bearbeiten wurde gemacht. – geisterfurz007

0

Um den Abschnitt zwischen dem letzten Bindestrich und der nächsten zu letzten zu extrahieren, können Sie das folgende Skript verwenden (liefert die Saiten/Dateien als Zeilenargumente Befehl):

@echo off 
setlocal EnableExtensions EnableDelayedExpansion 

set "SEP=-" 

for %%A in (%*) do (
    set "ITEM=%%~A" 
    set "PREV=" 
    if defined ITEM (
     for %%B in ("!ITEM:%SEP%=" "!") do (
      set "PREV=!PART!" 
      set "PART=%%~B" 
     ) 
     if defined PREV (
      echo(!PREV! 
     ) 
    ) 
) 

endlocal 
exit /B 

Dieser Ansatz grundsätzlich ersetzt alle - durch den Standard cmd Tokenisierungszeichen SPACE und iteriert durch die resultierende Zeichenfolge mit einem Standard for Schleife (keine /F Option). Der aktuell iterierte Teil wird in der Variablen PART gespeichert, deren Inhalt zuerst in PREV kopiert wird, um eine Verzögerung von einer Schleifeniteration zu erhalten.So wird der vorletzte Teil schließlich in PREV gespeichert.

Beachten Sie, dass dieses Skript möglicherweise unerwartete Ergebnisse zurückgibt, wenn die Zeichenfolgen/Dateien wegen delayed expansion Ausrufezeichen enthalten.

Verwandte Themen