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.
Ist der Dateiname immer gleich aufgebaut? Soll der dritte Teil durch '-'s getrennt sein? – geisterfurz007
@ geisterfurz007 Muss nicht unbedingt der 3. Teil sein, weshalb ich versuche die letzte Indexfunktion zu verwenden. – Ash
Wird es immer die gleiche Länge haben? Und wird es ein '-' sicher danach geben? – geisterfurz007