【问题标题】:Check that string/foldername contains specific character exactly X times检查字符串/文件夹名是否包含特定字符 X 次
【发布时间】: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


【解决方案1】:

根据@aschipfl 的想法,我找到了一种让它发挥作用的方法。

跨块边界传输变量基于:Windows batch setlocal enabledelayedexpansion call return value

@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.
    )



)

【讨论】:

  • 对!除了普遍的混乱之外,没有其他原因。我删除了它并做了一些更好的调试打印。
  • 你可以留下一个简单的setlocal(不带参数)只是为了批处理文件不要留下任何环境变化......
  • 谢谢。我已经添加了。
猜你喜欢
  • 1970-01-01
  • 2014-01-08
  • 1970-01-01
  • 2010-12-20
  • 2013-02-05
  • 2021-12-05
  • 2019-08-15
  • 1970-01-01
  • 2012-01-14
相关资源
最近更新 更多