gpt4 book ai didi

windows - 为什么此批处理脚本中的FOR/f循环求空行?

转载 作者:行者123 更新时间:2023-12-03 20:56:36 25 4
gpt4 key购买 nike

我正在尝试编写一个批处理脚本,以获取(除其他事项外)计算机具有的所有磁盘驱动器的列表。基本代码如下所示:

REM Build the list of disk drives to monitor
SETLOCAL enabledelayedexpansion
FOR /f "skip=1 tokens=1 delims=:" %%a in ('"WMIC logicaldisk WHERE drivetype=3 GET deviceid"') do (
SET "DISK_DATABASES=!DISK_DATABASES!%%a|"
SET "DRIVES_TO_MONITOR=!DRIVES_TO_MONITOR!%%a:\\|"
)

我显然可以建立两个格式稍有不同的列表,以备后用。但是,当我运行此命令时,我得到的输出看起来像这样:
C|D|E||
C:\\|D:\\|E:\\|:\\|

现在,我希望在两种情况下都可以使用尾随管道,并且我可以对其进行管理,但我真的很困惑,为什么在其中有多余的空白条目。如果我手动运行 wmic命令,我可以看到输出末尾确实有一个空行,但是我的理解是 /f专门应该忽略空行。

如果我打开 ECHO,则看起来最后一行只是作为回车符/换行符或类似内容进入的。有没有一种方法可以实现我的期望?我想念什么吗?我试图在循环中写一个 if条件以排除最后这一行,但是它很时髦,而且从未奏效。我感谢任何/所有帮助。

最佳答案

在这种情况下,最后一次迭代不会产生空项目,并且您只能通过C|D|E||获得echo %DISK_DATABASES%的输出,
但是echo !DISK_DATABASES!将输出||D|E| ??

这是因为最后一个元素是一个<CR>字符。
扩展百分比后,会直接删除<CR>字符,但不能延迟扩展。

您可以避免这种情况,使用百分比扩展将其删除

setlocal EnableDelayedExpansion
FOR /f "skip=1 tokens=1 delims=:" %%a in ('"WMIC logicaldisk WHERE drivetype=3 GET deviceid"') do (
set "item=%%a"
call :removeCR

if not "!item!"=="" (
SET "DISK_DATABASES=!DISK_DATABASES!!item!|"
SET "DRIVES_TO_MONITOR=!DRIVES_TO_MONITOR!!item!:\\|"
)
)
goto :eof
:removeCR

:removeCR
set "Item=%Item%"
exit /b

关于windows - 为什么此批处理脚本中的FOR/f循环求空行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8015489/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com