Powershell 是否可以将后续信息输出到同一行
我有一个脚本,可以ping一个ip地址并将该信息发送到控制台窗口。如果ping次数高或ping丢失,也会将其写入日志。我想在控制台窗口中只保留高ping次数和错过的ping,并允许好的ping相互覆盖。可能吗 对于高ping次数,这是输出(类似代码用于错过的ping) 对于正常的ping时间,输出如下Powershell 是否可以将后续信息输出到同一行,powershell,powershell-4.0,Powershell,Powershell 4.0,我有一个脚本,可以ping一个ip地址并将该信息发送到控制台窗口。如果ping次数高或ping丢失,也会将其写入日志。我想在控制台窗口中只保留高ping次数和错过的ping,并允许好的ping相互覆盖。可能吗 对于高ping次数,这是输出(类似代码用于错过的ping) 对于正常的ping时间,输出如下 $out ("{0}ms" -f $ping.ResponseTime) write-host $out -foregroundcolor "green" 我想让最后一行只覆盖正常ping,但让
$out ("{0}ms" -f $ping.ResponseTime)
write-host $out -foregroundcolor "green"
我想让最后一行只覆盖正常ping,但让高ping和漏ping在程序运行时向上推屏幕。这是我在PS中可以做到的吗
解决方案
感谢@Mathias R.Jensen,我想出了这个解决方案:
if ($ping.statuscode -eq 0) {
if ($ping.responsetime -gt $waitTime) {
$highPings = $highPings + 1
$out = ("{0}ms at $(get-date -format G)" -f $ping.ResponseTime)
[console]::SetCursorPosition(0,$highPings + $droppedPings + 1)
write-host $out -foregroundcolor "yellow"
$out >> $outFile
}
else {
$out = ("{0}ms $i of $pingCount" -f $ping.ResponseTime)
[console]::SetCursorPosition(0,$highPings + $droppedPings + 2)
write-host $out -foregroundcolor "green"
}
}
else {
$droppedPings = $droppedPings + 1
$out = ("missed ping at $(get-date -format G)")
[console]::SetCursorPosition(0,$highPings + $droppedPings + 1)
write-host $out -foregroundcolor "red"
$out >> $outFile
}
我认为您应该使用
编写进度
进行良好的ping。您不需要给出百分比,您可以使用-Status
参数仅显示最后一个好的百分比
下面是我编写的一个小示例,它可能会演示它的外观/操作(您可以自己执行它来查看,它不会ping任何东西,只是一个模拟):
$goods=0
0..100 | % {
如果((随机-最小0-最大100)-ge 50){
$goods+=1
写入进度-活动测试-状态“上次良好ping:$\($good total good pings)”
}否则{
写入警告“坏ping”
}
开始睡眠-秒1
}
在这种情况下,您甚至可以计算出良好ping的百分比,并将其用于
编写进度
,但我想表明,您不需要将其用作进度条,这样它才有用。我认为您应该使用编写进度
进行良好ping。您不需要给出百分比,您可以使用-Status
参数仅显示最后一个好的百分比
下面是我编写的一个小示例,它可能会演示它的外观/操作(您可以自己执行它来查看,它不会ping任何东西,只是一个模拟):
$goods=0
0..100 | % {
如果((随机-最小0-最大100)-ge 50){
$goods+=1
写入进度-活动测试-状态“上次良好ping:$\($good total good pings)”
}否则{
写入警告“坏ping”
}
开始睡眠-秒1
}
在这种情况下,您甚至可以计算出良好ping的百分比,并在编写进度中使用它,但我想表明,您不需要将其用作进度条,它才有用。有更好的方法来实现这一点,但我一直在尝试,并提出了这一点。它不会在ISE中工作,但应该在PowerShell控制台上完成它的工作。它使用“`b”
,这是退格字符,因此文本将在控制台主机写入时覆盖自身。可能对您没有帮助,但可能对其他人有用
开关($ping.ResponseTime){
{$\ge 0-和$\le 100}{
$out=“{0}ms”-f$_
$options=@{ForegroundColor=“Green”;NoNewline=$true}
$backup=“`b”*$out.Length
}
{$\ge 500-和$\le 900}{
$out=“{0}ms at$(获取日期-格式G)”-f$_
$options=@{ForegroundColor=“Yellow”;NoNewline=$false}
$backup=“`n”
}
}
写入主机“$backup$out”@选项
使用开关
根据ping时间范围设置选项。设置一个小散列表,该散列表将散列到写入主机
。虽然不完美,但它展示了另一种方法
同样,这样做主要是为了好玩 有更好的方法来解决这个问题,但我一直在玩,也想出了这个办法。它不会在ISE中工作,但应该在PowerShell控制台上完成它的工作。它使用“`b”
,这是退格字符,因此文本将在控制台主机写入时覆盖自身。可能对您没有帮助,但可能对其他人有用
开关($ping.ResponseTime){
{$\ge 0-和$\le 100}{
$out=“{0}ms”-f$_
$options=@{ForegroundColor=“Green”;NoNewline=$true}
$backup=“`b”*$out.Length
}
{$\ge 500-和$\le 900}{
$out=“{0}ms at$(获取日期-格式G)”-f$_
$options=@{ForegroundColor=“Yellow”;NoNewline=$false}
$backup=“`n”
}
}
写入主机“$backup$out”@选项
使用开关
根据ping时间范围设置选项。设置一个小散列表,该散列表将散列到写入主机
。虽然不完美,但它展示了另一种方法
同样,这样做主要是为了好玩 正如我在评论中提到的,光标位置可以通过以下方法控制:
[control]::SetCursorPosition([int]$x,[int]$y)
[console]
类型加速器指向同一个类,该类使您能够在C#console应用程序中将WriteLine()
写入控制台。如果您愿意,还可以控制颜色和其他控制台行为:
Clear-Host
[console]::ForegroundColor = "Red"
1..10|%{
[console]::SetCursorPosition(2+$_,$_-1)
[console]::WriteLine("Hello World!")
}
[console]::ForegroundColor = "Green"
正如我在评论中提到的,光标位置可以通过以下方法控制:
[control]::SetCursorPosition([int]$x,[int]$y)
[console]
类型加速器指向同一个类,该类使您能够在C#console应用程序中将WriteLine()
写入控制台。如果您愿意,还可以控制颜色和其他控制台行为:
Clear-Host
[console]::ForegroundColor = "Red"
1..10|%{
[console]::SetCursorPosition(2+$_,$_-1)
[console]::WriteLine("Hello World!")
}
[console]::ForegroundColor = "Green"
简单的解决方案是使用带有if语句的Clear Host
,或者在ping的同一块中。这样行吗?在console中,您还可以使用Backspaces进行奇特的步法。您是否希望输出一行类似于旧archivers进度条的内容,如旧的pkzip.exe
在压缩test.dat.2%
的行中所做的,并随时间用更高的值覆盖该百分比?我对此表示怀疑,Powershell不喜欢干扰流。我已经用$h=[char]8
(Ctrl+h,一个退格)进行了检查,结果为否,输出该字符串并没有改变字符串的前一部分,因此在Powershell自己的窗口中可能无法执行该操作。@Matt clear ho