Loops 批次–;具有错误级别条件的Findstr,引号?
我编写了一个batchfile脚本,作为连接到网络共享的接口。这一点很简单。它有一个我的共享列表,我想将其与正在使用的网络共享进行比较,并在找到时禁用该共享作为选项。下面的代码片段是for循环的一部分,该循环迭代列表中的共享数并列出它们Loops 批次–;具有错误级别条件的Findstr,引号?,loops,batch-file,quotes,lan,findstr,Loops,Batch File,Quotes,Lan,Findstr,我编写了一个batchfile脚本,作为连接到网络共享的接口。这一点很简单。它有一个我的共享列表,我想将其与正在使用的网络共享进行比较,并在找到时禁用该共享作为选项。下面的代码片段是for循环的一部分,该循环迭代列表中的共享数并列出它们 setlocal enabledelayedexpansion set list[0]="\\xxx.xxx.x.xx\photo" set list[1]="\\xxx.xxx.x.xx\photo 2" for /l
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
开关,但这根本不起作用。不确定带双引号的条目是否干扰。删除列表中的双引号会产生一个错误,即空格后的数字无法打开。我的方法正确吗?我可以设想一种稍微不同的方法吗
@echo off
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 (
net use |findstr ilc:" !list[%%n]! " >nul && (
echo found "!list[%%n]!", do command1
) || (
echo no match for "!list[%%n]!" do command2
)
)
对代码的更改:
- 使用
而不是net use
,因为wmic
输出Unicode,这是我们必须处理的。而且wmic
要快得多网络使用
- 使用条件运算符
和&&
而不是|
errorlevel
- 使
更加安全findstr
- 丢弃了findstr的输出
- 更正了
语法,使其不包含值的引号set
%errorlevel%
变量一起使用。这是否回答了您的问题?在括号内的一系列指令(也称为“代码块”)中,任何%var%
,包括%errorlevel%
,在验证块语法时,都会被该变量的当前(“解析时间”)值所取代,因此延迟扩展
和!瓦尔代码>需要用于访问变量的当前值,包括errorlevel。也可以使用语法if[not]errorlevel n
,意思是如果errorlevel为[not]“n”或大于“n”
。此外,将带引号的字符串分配给变量会使变量难以逻辑组合。根据需要插入引号要简单得多。顺便说一句:如果将for循环更改为for/F“tokens=2 delims==”%%i in('set list['),则根本不需要延迟扩展执行%SystemRoot%\System32\wbem\wmic.exe netuse get remotename |%SystemRoot%\System32\findstr.exe/C:%%i&&command 2 | | | command 1
。请参阅。我建议在命令提示符窗口中也运行findstr/?
,并阅读输出帮助,特别是有关选项/G
、/V
和/L
的使用情况。该任务可以这样做很可能更有效率。