我正在尝试制作一个批处理脚本,它将在文件中写入特定的 IP 地址。
我有一个 txt 文件(由一个 python 脚本创建),其中包含一个 IP 地址列表(每个新行一个),现在我需要使用 for 循环 ping 每个 IP,检查 TTL 值是否在 100 到 128 之间(windows 主机)并将 IP 地址写入新文件。我一直在尝试调整以设置变量和 for 循环,但这一切都变得太复杂而无法运行。
到目前为止,我已经达到:-
编辑:在命令下更正
for /f %i in (ip.txt) do ping -n 1 %i | find "TTL"
这将给我多行 Ping 输出,这里只显示单行(我使用 4.2.2.2 只是为了举例)
Reply from 4.2.2.2: bytes=32 time=1 ms ttl=45
如果我对单个 IP 执行 ping 命令,我可以选择 TTL 字段但不能选择 TTL 的确切值
for /f "tokens=6 delims= " %a in ('ping -n 1 4.2.2.2 ^| find "TTL"') do echo %a
它给了我值 TTL=45 而我需要 45 来进行比较。
我读到了 setlocal enabledelayedexpansion 这很有用,但我无法将这些全部组合成一行并使用 set 变量并使用 IF-ELSE 循环。
请给出一些关于如何实现IP选择的描述。
在制作批处理脚本解决方案后由我编辑:-
此批处理脚本将对 ips.txt 文件中给出的每个 IP 地址执行 ping 操作。查找 TTL 值,如果 TTL 值等于 128,它将运行命令 NBTSTAT -A ip-address(用于查找 GROUP 信息)并将其存储在nbt_query_op.txt 文件。
在为每个 IP 地址触发 NBTSTAT 命令之前,将搜索此文件以查找现有结果,如果在文件中找不到特定 IP 的结果,NBTSTAT
注意 变量 应该用! 字符引用,!TTL! , !ip1! , !ERRORLEVEL!。另外,也感谢RGuggisberg先生的指点。
@echo off
setlocal EnableDelayedExpansion
for /f %%i in (ips.txt) do (
for /f "tokens=6 delims= " %%a in ('ping -n 1 %%i ^| find "TTL"') do (
for /f "tokens=2 delims==" %%b in ('echo.%%a') do set ttl=%%b
echo %%i has TTL:- !ttl!
if !TTL! == 128 (set ip1=%%i
echo SELECTED IP- !ip1! TTL- !TTL!
findstr /c:!ip1! nbt_query_op.txt
if not !ERRORLEVEL! ==0 echo !ip1!>>nbt_query_op.txt && nbtstat -A !ip1! | find "GROUP">>nbt_query_op.txt
)
)
)
谢谢,
克里斯
最佳答案
在 vbscript 中你可以做这样的事情:
strHost = "4.2.2.2"
if Ping(strHost) = True then
Wscript.Echo "Host " & strHost & " contacted"
Else
Wscript.Echo "Host " & strHost & " could not be contacted"
end if
'***************************************************************************************
Function Ping(strHost)
dim objPing, objRetStatus
set objPing = GetObject("winmgmts:{impersonationLevel=impersonate}").ExecQuery _
("select * from Win32_PingStatus where address = '" & strHost & "'")
for each objRetStatus in objPing
if IsNull(objRetStatus.StatusCode) or objRetStatus.StatusCode <> 0 then
Ping = False
WScript.Echo "Status code is " & objRetStatus.StatusCode
else
Ping = True
Msg = Msg & " Pingging " & strHost & vbCrlf & vbCrlf
Msg = Msg & "Bytes = " & objRetStatus.BufferSize & vbCrlf
Msg = Msg & "Time (ms) = " & objRetStatus.ResponseTime & vbCrlf
Msg = Msg & "TTL (s) = " & objRetStatus.ResponseTimeToLive
end if
next
Wscript.echo Msg
End Function
'***************************************************************************************
编辑:2016 年 6 月 30 日 @ 19:11
我用这个文件测试过:file.txt
4.2.2.2 www.google.com www.google.fr www.facebook.com www.stackoverflow.com www.yahoo.com www.yahoo.fr www.developpez.net
这个批处理文件:
@echo off
Title Get TTL from IP adress
set vbsfile=%Tmp%\%~n0.vbs
set IP_File=E:\vb-ping\ip.txt
set LogFile=Log.txt
If Exist %LogFile% Del %LogFile%
For /f %%a in ('Type %IP_File%') Do (
echo TTL for "%%a" is : & Call:VBS "%%a"
( echo TTL for "%%a" is : & Call:VBS "%%a" )>> %LogFile%
)
echo.
color 0A
echo Hit any key to open the LogFile "%LogFile%"
pause>nul
Start "" %LogFile%
Exit /b
:VBS
(
echo wscript.echo TTL(WScript.Arguments(0^)^)
echo '**********************************************************************************************************
echo Function TTL(strHost^)
echo dim objPing, objRetStatus
echo set objPing = GetObject("winmgmts:{impersonationLevel=impersonate}"^).ExecQuery _
echo ("select * from Win32_PingStatus where address = '" ^& strHost ^& "'"^)
echo for each objRetStatus in objPing
echo if IsNull(objRetStatus.StatusCode^) or objRetStatus.StatusCode ^<^> 0 then
echo Ping = False
echo WScript.Echo "Status code is " ^& objRetStatus.StatusCode
echo else
echo Ping = True
echo TTL = objRetStatus.ResponseTimeToLive
echo end if
echo next
echo End Function
echo '**********************************************************************************************************
)> "%vbsfile%"
Cscript /Nologo "%vbsfile%" "%~1"
Exit /b
我得到了这样的输出结果:
TTL for "4.2.2.2" is : 53 TTL for "www.google.com" is : 51 TTL for "www.google.fr" is : 51 TTL for "www.facebook.com" is : 81 TTL for "www.stackoverflow.com" is : 53 TTL for "www.yahoo.com" is : 48 TTL for "www.yahoo.fr" is : 48 TTL for "www.developpez.net" is : 48
关于python - 嵌套的 for 循环,设置变量和 if else 在批处理脚本中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38119808/
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
我脑子里浮现出一些关于一种新编程语言的想法,所以我想我会尝试实现它。一位friend建议我尝试使用Treetop(Rubygem)来创建一个解析器。Treetop的文档很少,我以前从未做过这种事情。我的解析器表现得好像有一个无限循环,但没有堆栈跟踪;事实证明很难追踪到。有人可以指出入门级解析/AST指南的方向吗?我真的需要一些列出规则、常见用法等的东西来使用像Treetop这样的工具。我的语法分析器在GitHub上,以防有人希望帮助我改进它。class{initialize=lambda(name){receiver.name=name}greet=lambda{IO.puts("He
我得到了一个包含嵌套链接的表单。编辑时链接字段为空的问题。这是我的表格:Editingkategori{:action=>'update',:id=>@konkurrancer.id})do|f|%>'Trackingurl',:style=>'width:500;'%>'Editkonkurrence'%>|我的konkurrencer模型:has_one:link我的链接模型:classLink我的konkurrancer编辑操作:defedit@konkurrancer=Konkurrancer.find(params[:id])@konkurrancer.link_attrib
我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代
Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack
这道题是thisquestion的逆题.给定一个散列,每个键都有一个数组,例如{[:a,:b,:c]=>1,[:a,:b,:d]=>2,[:a,:e]=>3,[:f]=>4,}将其转换为嵌套哈希的最佳方法是什么{:a=>{:b=>{:c=>1,:d=>2},:e=>3,},:f=>4,} 最佳答案 这是一个迭代的解决方案,递归的解决方案留给读者作为练习:defconvert(h={})ret={}h.eachdo|k,v|node=retk[0..-2].each{|x|node[x]||={};node=node[x]}node[
我正在查看instance_variable_set的文档并看到给出的示例代码是这样做的:obj.instance_variable_set(:@instnc_var,"valuefortheinstancevariable")然后允许您在类的任何实例方法中以@instnc_var的形式访问该变量。我想知道为什么在@instnc_var之前需要一个冒号:。冒号有什么作用? 最佳答案 我的第一直觉是告诉你不要使用instance_variable_set除非你真的知道你用它做什么。它本质上是一种元编程工具或绕过实例变量可见性的黑客攻击
我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢
我正在编写一个gem,我必须在其中fork两个启动两个webrick服务器的进程。我想通过基类的类方法启动这个服务器,因为应该只有这两个服务器在运行,而不是多个。在运行时,我想调用这两个服务器上的一些方法来更改变量。我的问题是,我无法通过基类的类方法访问fork的实例变量。此外,我不能在我的基类中使用线程,因为在幕后我正在使用另一个不是线程安全的库。所以我必须将每个服务器派生到它自己的进程。我用类变量试过了,比如@@server。但是当我试图通过基类访问这个变量时,它是nil。我读到在Ruby中不可能在分支之间共享类变量,对吗?那么,还有其他解决办法吗?我考虑过使用单例,但我不确定这是
我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R