首页 > 解决方案 > 如何从批处理脚本中的分隔字符串中提取每个值以及如何放置标签以实现正确的流程

问题描述

我想从存储在变量中的路径中提取文件夹名称。我希望提取每个文件夹名称并将其存储在单独的变量中。我尝试了以下代码并获得了输出,但输出不如预期。我只想要一个周期的输出。我还想了解如何在批处理文件中放置标签。我在这方面遇到了困难。

查询1

set MYDIR=C:\FOLDER1\FOLDER2\FOLDER2

call :parse "%MYDIR%"
:parse
setlocal
set MYDIRS=%1
set MYDIRS=%MYDIRS:"=%
FOR /f "tokens=1* delims=\" %%a IN ("%MYDIRS%") DO (
  if not "%%a" == "" call :sub %%a
  if not "%%b" == "" call :parse "%%b"
)

:sub

@echo Subfolder extracted=^%1

输出

Subfolder extracted= C:
Subfolder extracted= FOLDER1
Subfolder extracted= FOLDER2
Subfolder extracted= FOLDER3
Subfolder extracted= C:
Subfolder extracted= FOLDER1
Subfolder extracted= FOLDER2
Subfolder extracted= FOLDER3

查询2

另外,当我使用标签检查我的字符串是否为空并且 uts 为空时,它应该转到 :eof 但是即使MYDIR不为空,它也会转到 eof

set MYDIR=C:\FOLDER1\FOLDER2\FOLDER2

if "%MYDIR%" == "" goto :err_emptyFile

:err_emptyFile
@echo File path is empty
goto :eof

call :parse "%MYDIR%"
:parse
setlocal
set MYDIRS=%1
set MYDIRS=%MYDIRS:"=%
FOR /f "tokens=1* delims=\" %%a IN ("%MYDIRS%") DO (
  if not "%%a" == "" call :sub %%a
  if not "%%b" == "" call :parse "%%b"
)

:sub

@echo Subfolder extracted=^%1

:eof
@echo :eof
@echo file path is empty

输出

File path is empty
:eof
File path is empty
Subfolder extracted= C:
Subfolder extracted= FOLDER1
Subfolder extracted= FOLDER2
Subfolder extracted= FOLDER3
Subfolder extracted= C:
Subfolder extracted= FOLDER1
Subfolder extracted= FOLDER2
Subfolder extracted= FOLDER3

标签: windowsbatch-filecmd

解决方案


脚本一次自上而下地运行一行,直到遇到 a goto,遇到 a call,被告知以 a 停止exit,或者它们运行的​​代码用完了。

标签就是这样 - 标签。他们所做的只是在脚本中指明一个特定的位置;它们没有任何东西可以阻止脚本进入标签标记的新部分。

因为您的第一个片段在循环之后不会更改代码流for,所以代码会继续向下,一次一行,直到到达:sub. 由于没有什么可以阻止您的代码进入该:sub部分,因此它会继续并再次运行,并且当前恰好在内存中设置了任何变量。

同样,您的第二个片段不会阻止您的代码立即输入:err_emptyFile.

在一些相关的注释中,:eof它已经是一个内置标签,您可以将其想象为脚本中的最后一行。请不要创建名为 的实际标签:eof,因为这可能会产生意想不到的后果。

子例程本质上是嵌入在主脚本中的小批量脚本,它们也不会停止,直到你用 agoto :eof或 an告诉它们exit /b(或者如果它们是脚本的最后一部分并且你用完了代码来执行)。

考虑到这一切,如果您告诉代码在正确的位置停止,您的脚本将正常运行:

@echo off
set MYDIR=C:\FOLDER1\FOLDER2\FOLDER3

if "%MYDIR%" == "" (
    echo File path is empty
    goto :eof
)

call :parse "%MYDIR%"
exit /b

:parse
setlocal
set MYDIRS=%1
set MYDIRS=%MYDIRS:"=%
FOR /f "tokens=1* delims=\" %%a IN ("%MYDIRS%") DO (
  if not "%%a" == "" call :sub %%a
  if not "%%b" == "" call :parse "%%b"
)
exit /b

:sub
echo Subfolder extracted=^%1

推荐阅读