批处理 – Findstr 错误级别条件,引号? [复制]
Posted
技术标签:
【中文标题】批处理 – Findstr 错误级别条件,引号? [复制]【英文标题】:Batch – Findstr with error level condition, quotes? [duplicate] 【发布时间】: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
的使用。这项任务很可能会更有效率地完成。
【参考方案1】:
我可以假设一个稍微不同的方法吗?
@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
,因为wmic
输出Unicode,我们必须处理它。而且net use
的速度要快得多。
使用条件运算符&&
和||
而不是errorlevel
使findstr
更加安全和
丢弃了findstr
的输出。
更正了 set
语法,使其不包含值的引号。
【讨论】:
以上是关于批处理 – Findstr 错误级别条件,引号? [复制]的主要内容,如果未能解决你的问题,请参考以下文章