Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 检查string/foldername是否正好包含X次特定字符_Windows_Batch File - Fatal编程技术网

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!
    )…您可以这样做,而不是计算分隔符的数量:
    for/F“tokens=1-4 delims=”(%%~ni)中的%%a)如果“%%c”=”(回显分隔符太少!),否则如果不是“%%d”=”(回显分隔符太多!)
    (假设可以将相邻的分隔符折叠为一个分隔符)…谢谢@aschipfl的建议。我喜欢上一个的简单性。但我很难让它正常工作。我想让它有可能放入预期的分隔符数量。因此我需要选择要查看的标记(除非我缺少一些技巧)。我试图计算令牌数,但似乎无法将其传递给下一个for循环。您可以通过变量设置
    令牌
    选项(就像对
    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.
        )
    
    
    
    )