Проверьте пустой токен в FOR / F Batch - PullRequest
0 голосов
/ 24 октября 2018

Я пытаюсь разбить строку в формате: client_subfolder_filename на три переменные: client, subfolder и filename (что также включает расширение)

Но я не могуудается проверить, не удалось ли выполнить синтаксический анализ (в этом случае файл не является допустимым файлом и его следует игнорировать)

Я попытался =="", ==[], not defined, not exist, но ничегопохоже на работу.В идеале я хотел бы проверить, является ли client, subfolder или fileName пустой строкой

Вот мой сценарий

@echo off

setlocal ENABLEDELAYEDEXPANSION
::mainDir is the directory where the customerfolders and the scripts are located
set mainDir=C:\Users\Me\Desktop\MyScript\src
cd %mainDir%
cd FilesToMove
set /a count=1

set client=""
set subfolder=""
set fileName=""


for %%i in (*) do (
  echo       !count! %%i
  set /a count=count+1

  for /F "tokens=1,2,3 delims=_" %%a in ("%%i") do (
    set client=%%a
    set subfolder=%%b
    set fileName=%%c

    if "!subfolder!" == "" goto NEXT
    if "!fileName!" == "" goto NEXT
    if not exist "%mainDir%\!client!\!subfolder!\" (mkdir "%mainDir%\!client!\!subfolder!")
    move %%i "%mainDir%"\!client!\!subfolder!\!fileName!"
    :NEXT
  )
)

1 Ответ

0 голосов
/ 24 октября 2018

Вы не можете использовать GOTO внутри команды FOR.Вырывается из команды FOR.Это твоя главная проблема.Независимо от того, зачем использовать отложенное расширение.Просто используйте переменные FOR напрямую со всеми другими вашими командами.Кроме того, НЕ делайте этого: set client="".Вы назначаете кавычки для переменной.Если вы хотите сделать его неопределенным, сделайте следующее: set "client=".

Чтобы проверить, являются ли %%b и %%c пустыми, используйте их обоих одновременно в команде IF.Переверните последовательность с одной стороны.Когда они не равны, вы знаете, что они оба заполнены.

Вот как я бы написал ваш сценарий.

@echo off
setlocal ENABLEDELAYEDEXPANSION

REM mainDir is the directory where the customerfolders and the scripts are located
set mainDir=C:\Users\Me\Desktop\MyScript\src
cd %mainDir%
cd FilesToMove
set /a count=0

for %%i in (*) do (
    set /a count+=1
    echo       !count! %%i
    for /F "tokens=1,2,3 delims=_" %%a in ("%%i") do (
        rem client=%%a
        rem subfolder=%%b
        rem fileName=%%c
        if NOT "%%b%%c"=="%%c%%b" (
            mkdir "%mainDir%\%%a\%%c"  >nul 2>&1
            move "%%~i" "%mainDir%\%%a\%%b\%%c"
        )
    )
)
...