在 FOR /F 批处理中测试空令牌
Test empty token in FOR /F Batch
我正在尝试使用以下格式拆分字符串: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
)
)
您不能在 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"
)
)
)
我正在尝试使用以下格式拆分字符串: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
)
)
您不能在 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"
)
)
)