Убедитесь, что строка / имя_фоли содержит конкретный символ ровно X раз - PullRequest
0 голосов
/ 13 июня 2019

Я пытаюсь создать пакетные файлы, которые:

  • находит все папки, содержащие определенный файл (_extern.inf) <- WORKING </li>
  • Убедитесь, что имя папки содержитровно X число разделителя.В противном случае игнорировать файл (т. Е. Если имя папки не соответствует ожидаемому формату, игнорировать папку) <- НЕ РАБОТАЕТ </li>
  • Разбивает имя папки по разделителю и использует одну из подстрок, чтобы указать путь для перемещения папки.на <- РАБОТАЕТ </li>

У меня все работает, кроме чека.Я видел Batch File Count все вхождения символа в строке , но мне кажется, что он не работает (% count% пуст).Я думаю, из-за вложенного цикла.Также кажется, что разрыв цикла для файлов, которые не соответствуют, не является тривиальным ...

Это %%~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"
        )
    )

)

1 Ответ

1 голос
/ 14 июня 2019

Основываясь на идеях @aschipfl, я нашел способ заставить его работать.

Транспортировка переменных через границы блоков основана на этом: Пакетная установка Windows setlocal enabledelayedexpansion возвращаемое значение

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



)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...