为什么命令FIND导致我的批处理脚本挂起?

时间:2018-03-06 03:01:08

标签: batch-file

我很清楚为什么命令find导致我的批处理脚本挂起。

for /f %%a in ('reg query HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\ /s') do find /i "tasksche" | echo %%a

我可以通过更改脚本并添加一些调试文本来证明这一点,以向我显示挂起的位置及其结果。我也试过了findstr,但也会出现相同的结果。

我也对其他建议持开放态度。可悲的是,在这种环境下,它必须是一批。

我们需要一种在注册表中搜索这个讨厌的wanacry东西的方法。

另外,为什么批处理脚本是世界上唯一没有CONTAINS语句的脚本呢?

1 个答案:

答案 0 :(得分:1)

使用没有文件名的命令 FIND 会等待代码不向其发送数据的句柄 STDIN 的输入。所以 FIND 正在等待并等待输入数据。

你很可能想要这样的东西:

for /F "tokens=2*" %%I in ('%SystemRoot%\System32\reg.exe query "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Run" /s 2^>nul ^| %SystemRoot%\System32\find.exe /I "tasksche" 2^>nul') do echo %%J

命令 FOR 在后台运行的单独命令进程中以cmd.exe /C命令行启动:

C:\Windows\System32\reg.exe query "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Run" /s 2>nul | C:\Windows\System32\find.exe /I "tasksche" 2>nul

REG 会输出错误消息以处理 STDERR 如果查询的密钥不存在,并且{{1}重定向到设备 NUL 抑制它或输出以处理 STDOUT 指定注册表项中的所有值和子键。

REG 的输出被重定向到处理命令 FIND STDIN 2>nul在行中搜索不区分大小写对于|,只输出包含此字符串的行。

FIND 如果在任何行中找不到搜索到的字符串,则表示 FOR 命令根本不执行tasksche,则不输出任何内容。 FIND 输出错误以处理 STDERR 的可能性不大,但也会被重定向到设备 NUL 以抑制它。

另请阅读Microsoft有关Using Command Redirection Operators的文章,了解echo %%J2>nul的说明。重定向操作符|>必须使用 FOR 命令行上的插入符|进行转义,以便在Windows命令解释程序处理此命令行时将其解释为文字字符在执行命令 FOR 之前,它在后台启动的单独命令进程中执行带^reg的嵌入式命令行。

FOR 将输出捕获到已启动后台命令进程的 STDOUT ,这是 FIND 输出的行。然后 FOR 将不以分号开头的每个非空行拆分为使用空格和水平制表符作为分隔符的子字符串。

使用 FOR 选项find指定第二个字符串(注册表值类型)应该分配给循环变量tokens=2*,并且第二个子字符串之后的空格/制表符之后的所有内容都应该根据{{​​3}}分配给下一个循环变量I,而不在空格/制表符上进一步分割。

分配给循环变量J的注册表值类型很可能没有意义。有趣的是由 REG 输出的完全限定文件名和 FIND 作为第三个值,它还可以包含一个或多个空格并分配给循环变量 J ECHO 输出的值。

要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。

  • I
  • echo /?
  • find /?
  • for /?
  • reg /?