【发布时间】:2019-06-13 15:35:22
【问题描述】:
我正在尝试制作一个批处理文件:
- 查找包含特定文件 (_extern.inf) 的所有文件夹
- 检查文件夹名称是否正好包含 X 个分隔符。否则忽略文件(即,如果文件夹名称不是预期格式,则忽略文件夹)
- 用分隔符分割文件夹名称,并使用其中一个子字符串来制作将文件夹移动到的路径
除了支票之外,我一切正常。 我见过Batch File Count all occurrences of a character within a string,但它似乎对我不起作用(%count% 为空)。我猜是因为嵌套的 for 循环。 似乎打破不符合文件的循环也不是微不足道的......
我想检查%%~ni 是否包含%expect_delims% 出现的%delim%。如果没有继续下一个文件夹。
@echo off
REM No trailing spaces!
set "infolder=input_path"
set "outfolder=output_path"
set "delim=_"
set "expect_delims=2"
REM Resursively look for folders with _extern.inf files
for /d /r "%infolder%" %%i in (*) do @if exist %%i\_extern.inf (
REM echo the folder is %%i
REM tokens decide which part to take of the split string.
REM "tokens=1,3" would take first and third and make %%b available
for /F "tokens=1 delims=%delim%" %%a in ("%%~ni") do (
REM Create project folder if doesn't exist
if not exist "%outfolder%\%%a.raw\Data\" (
echo creating folder %outfolder%\%%a.raw\Data
mkdir "%outfolder%\%%a.raw\Data"
)
REM move folder if doesn't exist
if exist "%outfolder%\%%a.raw\Data\%%~nxi" echo raw folder already exists!
if not exist "%outfolder%\%%a.raw\Data\%%~nxi" (
echo Moving "%%~fi" to "%outfolder%\%%a.raw\Data\%%~nxi"
move "%%~fi" "%outfolder%\%%a.raw\Data\%%~nxi"
)
)
)
【问题讨论】:
-
把统计分隔符个数的代码放到一个子程序中,通过
call调用,再试一次;如果你把它放在你的循环中%count%将不会更新(除非你启用delayed expansion 并写!count!)... -
不计算分隔符的数量,您可以这样做:
for /F "tokens=1-4 delims=_" %%a in ("%%~ni") do if "%%c" == "" (echo Too few delimiters!) else if not "%%d" == "" (echo Too many delimiters!)(假设可以将相邻的分隔符合并为一个)... -
感谢@aschipfl 的建议。我喜欢最后一个的简单。但我无法让它发挥作用。我希望可以放置多少个分隔符。所以我需要选择要查看的令牌(除非我缺少一些技巧)。我试图计算令牌编号,但似乎无法将其传递给下一个 for 循环。
-
您可以通过变量设置
tokens选项(就像您为delims所做的那样),但请确保对该变量使用立即(%)扩展(或参数一个子程序,比如%~1)... -
所以
tokens=1,%start_char%,%end_char%?但如果我这样做,它们是空的......我想我错过了一些技巧......
标签: windows batch-file