我正在处理批处理脚本,该脚本将查询其他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
答案 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时才会输出。如果您希望%%b
在120 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
以在屏幕上显示结果。