0

現在のディレクトリにあるすべてのファイル名 (pdf ファイル) の一部を抽出しようとしています。

ファイル名の長さは、常に 16 文字である最後の部分 (日時と拡張子) を除いて異なります。残りの部分は常に異なる長さになります。私が必要とする部分でさえ、長さが異なる場合があります。

こちらで取得したlastIndexOf関数を使ってみました。

ファイル名 例:academyo-nonpo - 2582365-082416051750.pdf

太字のセクションを抽出したい。最初に最後の 17 文字をトリミングしてみました (この部分は常に固定長になります)。次に、'-' の最後のインデックスを取得しようとしました (最初の部分は可変長の文字を持つことができるため)。その位置まで文字をトリミングします。 、ファイル名の必要な部分を返す必要があります。

@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

3 番目のパラメーターとして関数に渡された変数の参照は、必要な値を返していないようです。ここで何が悪いのかわかりません。

4

3 に答える 3

0

この回答をご覧ください。最初にトークンの数を数え (この前に文字列をトリミングする必要があります)、次に最後のトークンを取得することをお勧めします。

最初のループでは"tokens=1*"、次のように編集する必要があります"tokens=1* delims=-"。2 番目のループでは、delims=-後に%i%. スクリプト全体で次のようになります。

@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!

テストしたところ、のようなものでも正しく動作しているようですがac-ade-myo-n-on-po-15482729242321654-082416051750.pdf、正しく終了した後、見つからない構文エラーでエラーメッセージが1回表示されます...

そのエラーを無視できる場合 (他のすべてが機能する場合)、これが役立つ場合があります。

于 2016-09-27T08:47:24.717 に答える
0

太字のセクションを取得するには、次のようにします。

例#

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

さて、どうですか?

@Echo Off
SetLocal EnableDelayedExpansion
For %%# in ("%~dp0*.pdf") Do (
    Set "File=%%~n#"
    Set "File=!File:~,-13!"
    Call :Sub "!File:-=\!%%~x#")
Pause
:Sub
Echo=%~nx1
于 2016-09-27T08:17:59.753 に答える