簡體   English   中英

Windows批處理:循環獲取可變長度的子字符串

[英]Windows batch: get substring of variable length in loop

我想在for循環中檢索可變長度的子字符串,如下所示:

@ECHO off
setlocal EnableDelayedExpansion
CALL :strlen orglength %cd%
FOR /F "DELIMS==" %%d in ('DIR /AD /B /S') DO ( 
SET a=%%d
CALL :strlen curpatlen !a! ::sets curpatlen the length of string a
SET /a l=%orglength%-!curpatlen!

::crucial part: get the last l characters of a
CALL SET curpat=%!a:~!l!!% ::doesnt work

ECHO !curpat!
)

:strlen <resultVar> <stringVar>
(   
set "s=!%~2!#"
set "len=0"
for %%P in (4096 2048 1024 512 256 128 64 32 16 8 4 2 1) do (
    if "!s:~%%P,1!" NEQ "" ( 
        set /a "len+=%%P"
        set "s=!s:~%%P!"
    )
)
)
( 
set "%~1=%len%"
exit /b
)

主要思想:從批處理文件的目錄X開始,創建一個名為X-svg的文件夾(這不是我故意發布的代碼的一部分)。 然后,我遍歷X的所有子目錄,尋找要轉換為.svg文件的.pdf文件(以后的工作)。 對於包含.pdf的X的所有子目錄,我想在X-svg中創建一個相應的文件夾,其中僅包含轉換后的.svg文件。 為了在X-svg中創建相應的文件夾,我的想法是將X-svg目錄的字符串長度保持在orglength中,計算當前路徑X / Y的長度以及兩者之間的差,以便能夠創建文件夾X-svg / Y,然后將可用的.pdf轉換為該文件夾。

我想在上面的代碼中執行以下操作:給定org路徑字符串org的長度orglength,我想獲取org和當前路徑%% d之間的差異字符串,該字符串使每個循環都陷入困境。 靜態子字符串長度為4的示例為:

REM FOR loop over %%d
set str=%%d
set str=!str:~-4!

在我的情況下,我需要一個可變長度,而不是4,該長度是在for循環期間計算的。

先感謝您

編輯:此代碼對我有用:

@ECHO off
CALL :changefolder %cd% "svg"
xcopy "%cd%\*.pdf" "%Result%\" /T /S
for /f "delims=" %%A in ('cd') do (
     set foldername=%%~nxA
)
setlocal EnableDelayedExpansion
FOR /F "DELIMS==" %%f in ('DIR "*.pdf" /B') DO (
        set varpdf=%%f
        set var=!varpdf:~0,-3!
        "C:\Program Files (x86)\Inkscape\inkscape.exe" -f !varpdf! -l %Result%\!var!svg
    )
FOR /F "DELIMS==" %%d in ('DIR /AD /B /S') DO (  
    set PassedString=%%d
    call set tempstring=%%PassedString:\%foldername%\=\%foldername%-svg\%%
    FOR /F "DELIMS==" %%f in ('DIR "%%d\*.pdf" /B') DO (
        set varpdf=%%f
        set var=!varpdf:~0,-3!
        "C:\Program Files (x86)\Inkscape\inkscape.exe" -f %%d\!varpdf! -l !tempstring!\!var!svg
    )
)
endlocal
goto :eof

:changefolder
set Path1=%~1
set Path2=%~2
if {%Path1:~-1%}=={\} (set Result=%Path1:~-1%%Path2%) else (set Result=%Path1%-%Path2%)
goto :eof

可能不是最好的,但是可行

測試它是否創建所需的文件夾:

xcopy "x:\main\folder\*.pdf" "c:\x-org\" /T /S

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM