带有for,if和reg查询循环的嵌套批处理脚本

时间:2015-01-26 11:22:00

标签: windows batch-file cmd batch-processing

我正在处理批处理脚本,该脚本将查询其他Windows计算机上的某些注册表。在检查我是否从120到128获得TTL之后,它将迭代所有实时IP地址。另一个要求是首先检查每台机器上的第一个注册表查询是否成功。例如,它将从192.168.1.1开始,ping一次。 获取TTL值。 如果TTL的范围是120到128,那么它就是一个Windows系统。 现在查询第一个注册表 如果查询成功,则继续查询其他6个注册表并继续将结果写入txt文件。 ping部分我能够使用以下内容:

for /l %%a in (1,1,254) do for /f "tokens=8 delims=^= " %%b in ('ping -n 1 192.168.1.%%a ^| find /I "TTL"') do echo 192.168.1.%%a -- Online , TTL: %%b

现在我需要为它添加IF条件。但它没有显示任何输出:

for /l %%a in (1,1,254) do for /f "tokens=8 delims=^= " %%b in ('ping -n 1 192.168.1.%%a ^| find /I "TTL"') do if %%b==128 echo 192.168.1.%%a -- Online , TTL: %%b

接下来我需要查询以下注册表:

reg query HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ComputerName\ActiveComputerName /v computername 2>null >> query_result.txt

如果成功,请查询其余的注册表。 并且必须对所有254个IP地址重复所有过程。 我以一种简单而缓慢的工作方式随后做了一些事情(例如):

for /l %%i in (1,1,254) do (reg query \\192.168.1.%%i\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ComputerName\ActiveComputerName /v computername >> result.txt & reg query \\192.168.1.%%i\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion /v productname 2>null >> result.txt)

虽然上面的代码也有效,但是它非常慢,但是它也试图在死IP地址上查询注册表。我一直在使用3个结果文件单独跟踪这三种方法。我想打电话给他们。 如何将所有这些添加到一起? Plz阐明了IF条件语句的应用,以及如何使用它们。我已经尝试了2天但没有成功。

由于 marc_kriss

1 个答案:

答案 0 :(得分:1)

for /l %%a in (1,1,254) do for /f "tokens=8 delims=^= " %%b in ('ping -n 1 192.168.1.%%a ^| find /I "TTL"') do if %%b==128 echo 192.168.1.%%a -- Online , TTL: %%b

关闭,但仅当%%b正好为128时才会输出。如果您希望%%b120 to 128范围内,那么您需要

... do if %%b leq 128 if %%b geq 120 echo ...

其中leq表示小于或等于。我会让你猜出geq的意思......

而不是echo,你可以自然地使用

... geq 120 (
  echo processing 192.168.1.%%a onine TTL %%b
req query...192.168.1.%%a ...
)

使用选定的在线机器地址执行reg查询。


对评论的回应:

在我的机器上,我找到了

Reply from 127.0.0.1: bytes=32 time<1ms TTL=128
Reply from 192.168.0.1: bytes=32 time=1ms TTL=64

由于您没有发布过滤结果示例,我必须使用此数据。

现在,在第一个结果中,128显示为%% b`

在第二个中,TTL出现,因为=time,而不是<。因此,令牌需要为9而不是8。

或者您可以在yourstring模式下将整个字符串分配给环境变量delayedexpansion,然后使用

set "yourstring=!yourstring:*TTL=!"
set "yourstring=!yourstring:~1!"

然后,您需要将!yourstring!与120,128而不是%%b进行比较。


修订

@ECHO OFF
Setlocal EnableDelayedExpansion 
for %%a in (192.168.0.1 192.168.0.2 192.168.0.3 127.0.0.1) do for /f "delims=" %%b in ('ping -n 1 %%a ^| find /I "TTL"') do (
 ECHO TTL line found FOR %%a is %%b
 set "yourstring=%%b" 
 set "yourstring=!yourstring:*TTL=!" 
 set "yourstring=!yourstring:~1!"
 ECHO yourstring is "!yourstring!"
 if !yourstring! leq 128 if !yourstring! GEQ 65 (
  echo %%a online , TTL: !yourstring!
  ECHO now DO whatever with "%%a" or "!yourstring!"
  reg query HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ComputerName\ActiveComputerName /v computername 2>nul 
 )
 ECHO end report FOR %%a ===============================
)
GOTO :EOF

我的机器上的结果:

TTL line found FOR 192.168.0.1 is Reply from 192.168.0.1: bytes=32 time<1ms TTL=64
yourstring is "64"
end report FOR 192.168.0.1 ===============================
TTL line found FOR 192.168.0.2 is Reply from 192.168.0.2: bytes=32 time<1ms TTL=128
yourstring is "128"
192.168.0.2 online , TTL: 128
now DO whatever with "192.168.0.2" or "128"

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ComputerName\ActiveComputerName
    computername    REG_SZ    OWEN-PC

end report FOR 192.168.0.2 ===============================
TTL line found FOR 127.0.0.1 is Reply from 127.0.0.1: bytes=32 time<1ms TTL=128
yourstring is "128"
127.0.0.1 online , TTL: 128
now DO whatever with "127.0.0.1" or "128"

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ComputerName\ActiveComputerName
    computername    REG_SZ    OWEN-PC

end report FOR 127.0.0.1 ===============================

注意:TTL更正后的字符串选择错误 - 迷路~潜入(更正)

我使用了一组地址选择 - 您显然知道如何将其返回到for /l %%a ...以及如何根据需要构建192.168.1.%%a

我无法测试您似乎想要从活动计算机中检索的内容(计算机名称?),因为我没有任何其他计算机处于活动状态。我刚刚用TTL响应回来了。

注意nul而不是null使用后者会创建一个名为null的文件。

请注意,for /l需要3个参数 - 您的评论中有4个参数。

"delims== "中不需要插入符号(但无害)第一个="之间的字符是分隔符 - 但空格必须是最后一个(供将来参考) - "delims="关闭所有分隔符,因为分隔符计数在此应用程序中不可靠。

另请注意,我已将重定向移至query_result.txt以在屏幕上显示结果。