windows - 如何从批处理脚本中的分隔字符串中提取每个值以及如何放置标签以实现正确的流程
问题描述
我想从存储在变量中的路径中提取文件夹名称。我希望提取每个文件夹名称并将其存储在单独的变量中。我尝试了以下代码并获得了输出,但输出不如预期。我只想要一个周期的输出。我还想了解如何在批处理文件中放置标签。我在这方面遇到了困难。
查询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
解决方案
脚本一次自上而下地运行一行,直到遇到 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
推荐阅读
- java - 构建失败:等待 30 秒等待 com.google.common.util.concurrent.SettableFuture@4f4028ea[status=PENDING]
- javascript - 高度:100% 衬托 flexbox “除非移动,否则将滚动条粘贴到底部”
- c# - SSIS:创建文件夹的相同脚本。不同的结果?
- javascript - NPM 使用文件更新和过时的本地路径:
- python - 图像隐写脚本没有产生正确的结果
- forms - 如何在 Visual Fox Pro 中编辑网格?
- javascript - 流星反应项目的问题
- javascript - 如何在剑道网格中迭代选中的复选框数据?
- android - How to modify url webview in setting screen?
- python - ImportError:AWS EC2 实例上没有名为 boto3 的模块