繁体   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