【发布时间】:2021-04-05 10:34:04
【问题描述】:
我编写了一个批处理文件脚本,作为连接到我的网络共享的接口。在这一点上,它非常简单。它有一个我的共享列表,我想将其与正在使用的网络共享进行比较,并在找到该共享时将其禁用为选项。以下代码 sn-p 是 for 循环的一部分,该循环遍历列表中的共享数量并列出它们。
setlocal enabledelayedexpansion
set list[0]="\\xxx.xxx.x.xx\photo"
set list[1]="\\xxx.xxx.x.xx\photo 2"
for /l %%n in (0,1,2) do (
rem wmic netuse get remotename |findstr /C:!list[%%n]!
rem if %errorlevel% neq 0 do(command 1) else (command 2)
echo %%n !list[%%n]!
)
上面的rem 被删除以测试问题。
这里的想法是使用if %errorlevel% 条件来捕捉比赛。股票用双引号呼应。例如,如果安装了照片,则照片和照片 2 都将匹配,这是不希望的。
由于共享具有相似的名称并添加了带有空格的数字,因此我需要完全比较字符串,因此我尝试使用findstr /x 开关,但这根本不起作用。不确定带有双引号的条目是否会干扰。删除列表中的双引号会产生一个错误,即空格后的数字无法打开。我是否以正确的方式处理这个问题?
【问题讨论】:
-
延迟扩展也必须与
%errorlevel%变量一起使用。 -
这能回答你的问题吗? Variables are not behaving as expected
-
在括号内的一系列指令(又名“代码块”)中,任何
%var%,包括%errorlevel%,都被替换为该变量的当前(“解析时间”)值,当块语法正在验证中,因此需要使用delayedexpansion和!var!来访问变量的当前 值,包括errorlevel。也可以使用语法if [not] errorlevel n,意思是if the errorlevel is [not] "n" OR GREATER THAN "n"。此外,将带引号的字符串分配给变量会使变量难以在逻辑上组合。根据需要插入引号要简单得多。 -
顺便说一句:如果将 for 循环更改为
for /F "tokens=2 delims==" %%i in ('set list[') do %SystemRoot%\System32\wbem\wmic.exe netuse get remotename | %SystemRoot%\System32\findstr.exe /C:%%i && command 2 || command 1,则根本不需要延迟扩展。见single line with multiple commands using Windows batch file。我建议同时在命令提示符窗口中运行findstr /?并阅读输出帮助,尤其是关于选项/G、/V和/L的使用。这项任务很可能会更有效率地完成。
标签: loops batch-file quotes lan findstr