【问题标题】:How to get output of two different commands in two columns on powershell?如何在powershell的两列中获取两个不同命令的输出?
【发布时间】:2020-01-10 10:48:40
【问题描述】:

假设我有两个命令: 1) 获取日期 2) netstat -aon |发现str 20484 |测量-对象-线

如何循环运行这两个命令,睡眠时间为 60 秒?输出文件应该将这两个命令的结果打印在两个不同的列中,如下所示:

Date and Time         Netstat
2/2/2020 00:10          15
2/2/2020 00:11          20

提前致谢!

【问题讨论】:

  • 到目前为止你尝试了什么?

标签: powershell output


【解决方案1】:

试试这个:

(netstat -aon | findstr 20484 | Measure-Object -line | Select-Object @{l="Date";e={(Get-Date)}}, * | Format-Table | Out-String).Trim()

while( $true ) {

    sleep -Seconds 60

    (netstat -aon | findstr 20484 | Measure-Object -line | Select-Object @{l="Date";e={(Get-Date)}}, *  | Format-Table -HideTableHeaders | Out-String).Trim()

}

【讨论】:

    【解决方案2】:

    或者使用更强大的方式而不是findstr

    $maxLoops = 5   # set a max to the loop
    for ($i = 0; $i -lt $maxLoops; $i++) {
        [PsCustomObject]@{
            'Date and Time' = Get-Date
            'Netstat'       = (netstat -aon | Select-String 20484).Count
        }
        Start-Sleep -Seconds 60
    }
    

    【讨论】:

    • 请注意,隐式格式表会在输出任何内容之前等待 2 个对象。
    【解决方案3】:

    您可以执行以下操作:

    while (1) {
        [PsCustomObject]@{
            'Date and Time' = Get-Date -Format 'M/d/yyyy HH:mm'
            'NetStat' = netstat -aon | findstr 20484 |
                        Measure-Object -Line | Select -Expand Lines
        }
        sleep 60
    }
    

    说明:

    while 条件中的1 始终返回 true,因此除非手动中断,否则循环将永远不会结束。

    Measure-Object -Line 返回一个TextMeasureInfo 对象。由于您只需要该输出的行数,因此您需要检索 Lines 属性的值。通过管道连接到Select -Expand Lines 会执行此操作。

    Get-Date-Format 参数允许输入字符串格式表示,前提是允许所需的格式。

    [PsCustomObject] 是自定义对象的类型加速器。这允许在提供相关值的同时创建所需的标题/属性。值和/或属性可以在声明时或之后添加。

    @{} 语法围绕着一个哈希表。哈希表的目的是保存键/值对。自 PowerShell v3 以来,这为创建快速对象提供了一种简单的方法。

    sleepStart-Sleep 的别名。它可以接受-Seconds-Milliseconds,当只提供一个值时,-Seconds 是默认参数绑定。


    如果你不希望循环无限期地进行,你可以像这样添加一个计数器来循环 5 次:

    $count = 5
    while ($count--) {
        [PsCustomObject]@{
            'Date and Time' = Get-Date -Format 'M/d/yyyy HH:mm'
            'NetStat' = netstat -aon | findstr 20484 |
                        Measure-Object -Line | Select -Expand Lines
        }
        sleep 60
    }
    

    我不知道您是在搜索端口号还是进程标识符。由于理论上任何一个都可能在您的输出中,因此您可能需要考虑这种情况。如果您正在寻找一个端口,我会改用findstr :20484。如果你只想要一个进程标识符,我会使用netstat -ano | Where {$_ -match '\s20484'}

    【讨论】:

    • 请注意,前两个对象需要 60 秒才能出现。
    • @js2010,是的。我们可以将自定义对象通过管道传递给Out-Host
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-21
    • 2014-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多