【问题标题】:How to get a loop for telnet port check in 1 line for Powershell?如何在 Powershell 的 1 行中获取 telnet 端口检查的循环?
【发布时间】:2018-06-04 03:12:03
【问题描述】:

我想将以下命令简化为 1 行,执行循环,直到它返回 TRUE。

下面会检查TCP连接是否正常工作:

(New-Object System.Net.Sockets.TcpClient -ArgumentList DESTINATION-IP,PORT).Connected

如果没有阻止任何防火墙,这通常会打印/返回 TRUE。

我想要做的是,在没有脚本/文件的情况下,让这个命令循环,直到它返回一个 TRUE 值。

有什么想法吗?

【问题讨论】:

  • 为什么不使用nmap?它旨在做到这一点(以及更多)。
  • while ($true)?怎么样......是的,学习一些powershell的基础知识。有趣的事实:它与最常见的脚本语言相似。
  • 你的意思类似于 while((New-Object System.Net.Sockets.TcpClient -ArgumentList DESTINATION-IP,PORT).Connected){}
  • @vonPryz 超出公司政策,我们可能不会使用它。
  • @Clijsters ..........

标签: powershell tcp telnet


【解决方案1】:

这样的事情会起作用:

while ((New-Object System.Net.Sockets.TcpClient -ArgumentList DESTINATION-IP,PORT).Connected -ne $true) { Start-Sleep -Milliseconds 1000 }

我不建议睡眠时间少于 ~250 毫秒左右,除非你真的想连接洪水。

另外,请记住,在没有脚本文件的情况下,您不需要制作单行代码来调用脚本。 Powershell 有一个行尾终止符:;。您可以轻松拨打powershell -Command { 1; 2; 3; }


试试这个更健壮一点。您可以删除空格和换行符以使其成为单行,但我会将其格式化为便于阅读:

do {
    try {
        $Connected = (New-Object System.Net.Sockets.TcpClient -ArgumentList DESTINATION-IP,PORT -ErrorAction Stop).Connected;
    }
    catch {
        $Connected = $false;
    }
    if (!$Connected) { Start-Sleep -Milliseconds 1000; }
} until ($true.Equals($Connected));

【讨论】:

  • New-Object : 使用“2”参数调用“.ctor”的异常:“无法建立连接,因为目标机器主动拒绝了它 10.10.10.10:212”在行: 1 个字符:11
  • 可能不允许返回连接,不会返回 FALSE,但更多的是错误,这就是函数失败的原因。有没有办法说:Anything(false, error) but True,进入循环?
  • @SerdarEbeng 有点像。查看我更新的代码。部分问题在于您无法完全停止某些隐式类型转换。要明确“执行直到 $Connected 的类型为 System.Boolean 且值为 true”,您需要使用 $true.Equals()。通常你可以说until ($Connected)until ($Connected -eq $true)
猜你喜欢
  • 2014-12-03
  • 2012-11-11
  • 2017-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-23
相关资源
最近更新 更多