Windows批处理:在循环中获取可变长度的子字符串

时间:2014-08-21 07:26:27

标签: windows string loops variables batch-file

我想在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的所有子目录,寻找.pdf文件,我想将其转换为.svg文件(未来的工作)。对于包含.pdf的X的所有子目录,我想在X-svg中创建一个仅包含转换后的.svg文件的相应文件夹。为了在X-svg中创建相应的文件夹,我的想法是在orglength中保持X-svg目录的字符串长度,计算当前路径的长度X / Y以及两者之间的差异以便能够创建文件夹X-svg / Y,然后我将转换为可用的.pdf。

我想在上面的代码中做什么:给定一个路径字符串org的长度org,我想获得org和当前路径之间的差异字符串,%% d,它使每个循环都有。静态子字符串长度为4的示例是:

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

在我的情况下,我需要一个在for循环期间计算的变量长度而不是4。

提前感谢

编辑:此代码适用于我:

@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

可能不是最好但是有效

1 个答案:

答案 0 :(得分:0)

测试它以查看它是否创建了您需要的文件夹:

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