【问题标题】:Writing all output to a file将所有输出写入文件
【发布时间】:2014-03-27 19:09:44
【问题描述】:

我正在使用以下代码来获取具有 IP 地址的机器列表。它打印出主机名和 IP 地址。如果主机离线,它会显示“$computername is offline”。代码如下:

$csv = Get-Content TEST_MACHINES.csv

foreach ($computer in $csv)
{
    try
    {
         Test-Connection $computer -Count 1 -ErrorAction Stop | Select Address, IPV4Address 
    }
    catch
    {
         "$computer is offline" 
    }
 }

效果很好,输出数据如下:

地址 IPV4 地址

------- -----------

测试机 192.168.1.1

测试机2 192.168.1.2

TESTMACHINE3 离线。

但是,没有任何技巧可以让我将所有这些内容写入一个文件,即使它在控制台中显示是这样。它写入一个空白文件或只写入异常。

我怎样才能完全按原样捕获此输出?

【问题讨论】:

    标签: powershell


    【解决方案1】:

    您可以使用与您选择的测试连接字段相同的字段名称创建自定义 powershell 对象,然后将成功和失败都导出到 CSV。请参阅下面的示例:

    $csv = Get-Content TEST_MACHINES.csv
    
    foreach ($computer in $csv)
    {
        try
        {
            Test-Connection $computer -Count 1 -ErrorAction Stop | Select Address, IPV4Address | Export-Csv -Path .\ConnectionTest.csv -Append
        }
        catch
        {
            $Output = New-Object PSObject -Property @{
                Address = $computer
                IPV4Address = "Offline"
            }
    
            $Output | Export-Csv -Path .\ConnectionTest.csv -Append
        }
     }
    

    【讨论】:

    • 那只写脚本的第一部分。它确实在控制台中完美显示,但如果我运行像“./script.ps1 > results.txt”这样的脚本,results.txt 文件是空白的。我怎样才能让它将所有内容输出到结果文件?
    • 抱歉,这个回复有点晚了。上面写的代码不会产生任何输出到标准输出,因此使用 > results.txt 重定向它确实会导致一个空的 results.txt 文件。上述代码产生的所有标准输出都通过管道传输到 Export-Csv,这会将所有输出放在 Export-Csv -Path 参数中指定的文件中。我希望这会有所帮助。
    【解决方案2】:

    在我编写脚本的风格中,我会使用简单的 if..then..else 循环。这对我来说似乎最合乎逻辑。您确实在管道后尝试了“Out-File”开关,不是吗?...我刚刚在 localhost 和一些随机名称上运行了以下命令,效果很好...

    $csv = Get-Content TEST_MACHINES.csv
    
    foreach ($computer in $csv)
    {
        if (Test-Connection $computer -Count 1 -Quiet)
        {
        Test-Connection $computer -Count 1 -ErrorAction Stop | Select Address, IPV4Address | Out-file -append "SomeFile.txt"
        }
        else
        {
        "$computer is offline" | Out-File -Append "SomeFile.txt"
        }
     }
    

    【讨论】:

    • 对我来说,这会生成一个空的“somefile.txt”
    • 当我发布命令时,我会尝试输入一些内容...我将“localhost”和“www.google.com”放在一个 csv 文件中,它为我提供了 PS4.0 的输出你能分享一下 CSV 文件的前 3 行吗?或者尝试使用每行恰好包含 1 个条目的普通文件?编辑:奇怪的是你也收到了布兰登脚本的空白文件......
    【解决方案3】:

    试试这个:

    $csv = Get-Content TEST_MACHINES.csv
    '' > foo.log
    foreach ($computer in $csv)
    {
        try
        {
             Test-Connection $computer -Count 1 -ErrorAction Stop | Select Address, IPV4Address >> foo.log
        }
        catch
        {
             "$computer is offline" >> foo.log
        }
     }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-29
      • 2012-11-05
      • 1970-01-01
      • 2010-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-05
      相关资源
      最近更新 更多