Windows 检查string/foldername是否正好包含X次特定字符
我正在尝试创建一个批处理文件,该批处理文件:Windows 检查string/foldername是否正好包含X次特定字符,windows,batch-file,Windows,Batch File,我正在尝试创建一个批处理文件,该批处理文件: 根据@aschipfl的思想,查找包含特定文件(_extern.inf)的所有文件夹。我找到了一种使其工作的方法 跨块边界传输变量的基础是: 将用于计算分隔符数量的代码放入子例程,通过调用它,然后重试;如果将其放入循环中,%count%将不会更新(除非您启用并写入!count!)…您可以这样做,而不是计算分隔符的数量:for/F“tokens=1-4 delims=”(%%~ni)中的%%a)如果“%%c”=”(回显分隔符太少!),否则如果不是“%
- 根据@aschipfl的思想,查找包含特定文件(_extern.inf)的所有文件夹。我找到了一种使其工作的方法
跨块边界传输变量的基础是:
将用于计算分隔符数量的代码放入子例程,通过调用它,然后重试;如果将其放入循环中,
将不会更新(除非您启用并写入%count%
)…您可以这样做,而不是计算分隔符的数量:!count!
(假设可以将相邻的分隔符折叠为一个分隔符)…谢谢@aschipfl的建议。我喜欢上一个的简单性。但我很难让它正常工作。我想让它有可能放入预期的分隔符数量。因此我需要选择要查看的标记(除非我缺少一些技巧)。我试图计算令牌数,但似乎无法将其传递给下一个for循环。您可以通过变量设置for/F“tokens=1-4 delims=”(%%~ni)中的%%a)如果“%%c”=”(回显分隔符太少!),否则如果不是“%%d”=”(回显分隔符太多!)
选项(就像对令牌
所做的那样),但请确保对该变量(或子例程的参数,如delims
)使用立即(%%~1
%)展开…所以
?但是如果我这样做的话,它们是空的…我想我错过了一些技巧…对!除了一般的混乱之外没有其他原因。我删除了它并制作了一些更好的调试打印。你可以留下一个简单的tokens=1,%start\u char%,%end\u char%
(没有参数)只是为了批量文件不留下任何环境变化…谢谢。我已经添加了。setlocal
@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" ) ) )
@echo off REM ****** SETTINGS ****** REM No trailing spaces! set "infolder=input_dir" set "outfolder=output_dir" set "delim=_" set "expect_delims=4" REM SCRIPT STARTS HERE setlocal set /a "token_start=%expect_delims%+1" set /a "token_end=%expect_delims%+2" REM Resursively look for folders with _extern.inf files for /d /r "%infolder%" %%i in (*) do @if exist %%i\_extern.inf ( echo ****** Start processing ****** echo File: "%%~i" for /F "tokens=1,%token_start%,%token_end% delims=%delim%" %%a in ("%%~ni") do ( REM echo the raw folder is %%i if "%%b" == "" (echo Filename check: Too few delimiters. File ignored.) else ( if not "%%c" == "" (echo Filename check: Too many delimiters. File ignored.) else ( echo Filename check: OK 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 raw folder if doesn't exist if exist "%outfolder%\%%a.raw\Data\%%~nxi" echo raw folder already exists! File ignored. if not exist "%outfolder%\%%a.raw\Data\%%~nxi\" ( echo Moving "%%~fi" to "%outfolder%\%%a.raw\Data\%%~nxi" move "%%~fi" "%outfolder%\%%a.raw\Data\%%~nxi" ) ) ) echo ****** End processing ****** echo. ) )