如何解决如何在Powershell的后台连续进行ping操作?
这是我在Powershell中的第一个程序,我试图从用户输入中获取内容,然后ping通IP地址或主机名,在桌面上创建文本文件。 但是,如果用户想要添加多个IP,我将陷入无限循环。 我在这里询问IP地址。
$dirPath = "C:\Users\$env:UserName\Desktop"
function getUserInput()
{
$ipsArray = @()
$response = 'y'
while($response -ne 'n')
{
$choice = Read-Host '
======================================================================
======================================================================
Please enter HOSTNAME or IP Address,enter n to stop adding'
$ipsArray += $choice
$response = Read-Host 'Do you want to add more? (y\n)'
}
ForEach($ip in $ipsArray)
{
createFile($ip)
startPing($ip)
}
}
然后我为每个IP地址创建文件:
function createFile($ip)
{
$textPath = "$($dirPath)\$($ip).txt"
if(!(Test-Path -Path $textPath))
{
New-Item -Path $dirPath -Name "$ip.txt" -ItemType "file"
}
}
现在您可以看到问题了,因为我想要使用TIME格式进行写入,因此ForEach循环出现了问题,当我开始ping时,直到到达停止位置,我都无法到达数组中的下一个元素 cmd.exe。
function startPing($ip)
{
ping.exe $ip -t | foreach {"{0} - {1}" -f (Get-Date),$_
} >> $dirPath\$ip.txt
}
也许我应该为每个IP地址创建其他文件并传递参数?
解决方法
这是我的旧脚本。您可以在窗口中查看计算机列表。
ConcurrentDictionary<T>
# pinger.ps1
# example: pinger yahoo.com
# pinger c001,c002,c003
# $list = cat list.txt; pinger $list
param ($hostnames)
#$pingcmd = 'test-netconnection -port 515'
$pingcmd = 'test-connection'
$sleeptime = 1
$sawup = @{}
$sawdown = @{}
foreach ($hostname in $hostnames) {
$sawup[$hostname] = $false
$sawdown[$hostname] = $false
}
#$sawup = 0
#$sawdown = 0
while ($true) {
# if (invoke-expression "$pingcmd $($hostname)") {
foreach ($hostname in $hostnames) {
if (& $pingcmd -count 1 $hostname -ea 0) {
if (! $sawup[$hostname]) {
echo "$([console]::beep(500,300))$hostname is up $(get-date)"
$sawup[$hostname] = $true
$sawdown[$hostname] = $false
}
} else {
if (! $sawdown[$hostname]) {
echo "$([console]::beep(500,300))$hostname is down $(get-date)"
$sawdown[$hostname] = $true
$sawup[$hostname] = $false
}
}
}
sleep $sleeptime
}
,
看看PowerShell Jobs。请注意,有更好,更快的替代方法(例如线程作业,运行空间等),但是对于初学者来说,这是最简单的方法。基本上,它将启动一个新的PowerShell进程。
一个非常简单的例子:
function startPing($ip) {
Start-Job -ScriptBlock {
param ($Address,$Path)
ping.exe $Address -t | foreach {"{0} - {1}" -f (Get-Date),$_ } >> $Path
} -ArgumentList $ip,$dirPath\$ip.txt
}
这个简化的示例并不涉及停止作业。因此,根据您想要的行为,应该进行查找。
另外,请注意,PowerShell还相当于ping Test-Connection
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。