[英]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.