在 FOR /F 批处理中测试空令牌

Test empty token in FOR /F Batch

我正在尝试使用以下格式拆分字符串:client_subfolder_filename 分为三个变量: clientsubfolderfilename(也包括扩展名)

但是我无法测试解析是否失败(在这种情况下文件不是有效文件,应该被忽略)

我已经尝试了 ==""==[]not definednot exist,但似乎没有任何效果。理想情况下,我想测试 clientsubfolderfileName 是否为空字符串

这是我的脚本

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

您不能在 FOR 命令中使用 GOTO。它脱离了 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"
        )
    )
)