批处理 – 带有错误级别条件的 Findstr,引号?[复制]

Batch – Findstr with error level condition, quotes? [duplicate]

提问人:Enigma86 提问时间:12/29/2020 更新时间:12/30/2020 访问量:139

问:

我有一个批处理文件脚本,我编写了该脚本作为连接到网络共享的接口。在这一点上,它非常简单。它有一个我的共享列表,我想将其与正在使用的网络共享进行比较,并在找到该共享时禁用该共享作为选项。以下代码片段是 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]! 
)

为了测试问题,删除了上述内容。 这里的想法是使用条件来赶上比赛。股票用双引号呼应。例如,如果安装了照片,则照片和照片 2 都将匹配,这是不可取的。 由于共享具有相似的名称并添加了带空格的数字,因此我需要准确地比较字符串,因此我尝试了开关,但这根本不起作用。不确定带双引号的条目是否会干扰。删除列表中的双引号会产生一个错误,即无法打开空格后的数字。我是否以正确的方式处理这个问题?remif %errorlevel%findstr /x

loops batch-file quotes lan findstr

评论

2赞 Squashman 12/29/2020
延迟扩展也必须与变量一起使用。%errorlevel%
3赞 T3RR0R 12/29/2020
这回答了你的问题吗?变量的行为不符合预期
3赞 Magoo 12/29/2020
在括号内的一系列指令(又称“代码块”)中,当验证块语法时,任何 (包括 ) 都会被该变量的当前(“解析时间”)值替换,因此需要用于访问变量的当前值,包括 errorlevel。也可以使用语法,即 .此外,将带引号的字符串分配给变量会使变量难以逻辑组合。根据需要插入引号要简单得多。%var%%errorlevel%delayedexpansion!var!if [not] errorlevel nif the errorlevel is [not] "n" OR GREATER THAN "n"
2赞 Mofi 12/29/2020
顺便说一句:如果将 for 循环更改为 .请参阅使用 Windows 批处理文件的带有多个命令的单行。我建议在命令提示符窗口中运行并阅读输出帮助,特别是关于选项的用法,和。这项任务很可能可以更高效地完成。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 1findstr /?/G/V/L

答:

1赞 Stephan 12/29/2020 #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
  )
)

对代码的更改:

  • 使用而不是 作为输出 Unicode,我们必须处理它。而且速度要快得多。net usewmicwmicnet use
  • 使用条件运算符,而不是&&||errorlevel
  • 变得更加安全,并且findstr
  • discarded 的输出。findstr
  • 更正了语法,使其不包含值的引号。set