我想在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
可能不是最好但是有效
答案 0 :(得分:0)
测试它以查看它是否创建了您需要的文件夹:
xcopy "x:\main\folder\*.pdf" "c:\x-org\" /T /S