我需要编写一个批处理文件来转换每个子文件夹中的每个文件。我找到了以下解决方案:
set INDIR=<some path>
set OUTDIR=<some path>
mkdir "%OUTDIR%"
for /f "tokens=1*delims=." %%f in ('dir %INDIR% /b /a-d') do (
rem %%f is file name
rem %%g is extension
call convert_one . %%f %%g
)
)
for /f "delims==" %%d in ('dir %INDIR% /ad /b') do (
rem %%d is relative path
mkdir %OUTDIR%\%%d
for /f "tokens=1*delims=." %%f in ('dir %INDIR%\%%d /b /a-d') do (
rem %%f is file name
rem %%g is extension
call convert_one %%d %%f %%g
)
)
问题是它只遍历第一级子文件夹。当我将 / s 键添加到 dir 命令时,它会返回完整的pathes而不是相对的。
如何改进脚本以处理所有级别子文件夹?
PS:我需要相对路径,文件名和扩展名的单独值。
答案 0 :(得分:1)
你没有向我们展示convert_one
- 但这里有一些线索......
for /f "delims=" %%f in ('dir %INDIR% /b /s /a-d') do (
rem %%~dpnf is file name and path
rem %%~dpf is file absolute path
rem %%~nf is file name-part
rem %%~xf is extension
call convert_one "%%~dpf" "%%nf" %%~xf
)
)
请参阅提示中的for /?|more
了解更多信息......
(在你的子程序中,如果需要,n = 1..9条带引号的%~n - 应用引号意味着"strings containing spaces"
被视为单个字符串。
- 也许在那里制作目的地目录......?)
答案 1 :(得分:1)
@echo off
setlocal enableextensions disabledelayedexpansion
set "INDIR=%cd%"
set "OUTDIR=..\out"
subst :: /d >nul 2>&1 & subst :: "%INDIR%"
for /r "::\." %%a in (*) do (
if not exist "%OUTDIR%%%~pa" md "%OUTDIR%%%~pa"
call convert_one ".%%~pa" "%%~na" "%%~xa"
)
subst :: /d
这会创建一个子驱动器,因此驱动器的根目录指向in文件夹。然后遍历文件夹结构,重新创建输出文件夹中的结构,并使用指示的参数调用子例程