【问题标题】:Powershell - Change format of outputPowershell - 更改输出格式
【发布时间】:2013-10-27 22:16:47
【问题描述】:

如何更改我的代码生成的输出的显示方式:

$apps = Import-CSV apps.csv
$computers = Import-CSV compobj.csv
foreach($computer in $computers) {    
    $computerLob = $computer.lob
    $lobApps = $apps | ? {$_.lob -eq $computerLob }
    foreach($app in $lobApps){
       $computerHostname = $computer.hostname
       $appLocation = $app.location
       $installed=Test-Path "\\$computerHostname\$appLocation"      
       New-Object PSObject @{Computer=$computer.hostname;App=$app.appname;Installed=$installed} 
    }
}

我希望更改代码的显示方式。看起来是这样的:

Name                         Value                                                                                                            
----                         -----                                                                                                            
Installed                    True                                                                                                             
App                          App1                                                                 
Computer                     171.159.192.10
Installed                    True                                                                                                             
App                          App2                                                                         
Computer                     171.159.192.10

我希望它看起来像这样:

Computer                 App1    App2
-----------              ------    -----
171.159.192.10           True     True

【问题讨论】:

    标签: powershell csv


    【解决方案1】:

    您将哈希表作为其 ctor 参数而不是属性集传递给 New-Object。将其更改为:

    New-Object PSObject -Property @{
      Computer=$computer.hostname
      App=$app.appname
      Installed=$installed
    }
    

    【讨论】:

    • 非常感谢。遇到和上面一样的问题。我按以下顺序获取列Installed,App,Computer - 我可以按以下顺序获取它:Computer,App,Installed
    • @Antoine-LaurentLavoisier:你不能在 Powershell 中用select 语句选择任何订单吗?
    • @Neolisk - 请给我看一个简单的例子。不确定创建新对象时它是如何工作的。我一直在尝试切换-Property @{...}中的顺序
    • @Antoine-LaurentLavoisier:无论哪个未被捕获,都会被传送到管道上。将你的代码包装成一个函数,从你的主代码中调用这个函数,然后添加一个| select Computer,App,Installed。你觉得这有意义吗?
    • @Neolisk 不幸的是不是:(。我对这一切都很陌生。你能告诉我你的意思吗?
    【解决方案2】:

    如果您使用的是 PowerShell V3,而不是使用 new-object,您可以这样做:

    [pscustomobject]@{Computer=$computer.hostname;App=$app.appname;Installed=$installed} 
    

    在 V2 上,不要忘记使用 -Property 参数,例如:

    new-object psobject -property @{Computer=$computer.hostname;App=$app.appname;Installed=$installed} 
    

    要强制输出顺序,您可以使用 Format-Table:

    $obj = new-object psobject -property @{Computer=$computer.hostname;App=$app.appname;Installed=$installed} 
    $obj | Format-Table Computer,App,Installed
    

    【讨论】:

    • 这很好用!但是我按以下顺序获取列Installed,App,Computer - 我可以按以下顺序获取它:Computer,App,Installed。尝试使用所有东西的顺序,但它似乎不起作用!
    • 有趣的是,我现在使用 PowerShell v4 在我的系统上按顺序获取属性。您可以随时使用 Format-Table 选择您想要的特定顺序new-object ... | Format-Table Computer,App,Installed
    【解决方案3】:

    这就是我的意思(对 OP 在 cmets 中提出的问题的跟进,太大而无法放在那里):

    function MyFunction(){
      $apps = Import-CSV apps.csv
      $computers = Import-CSV compobj.csv
      foreach($computer in $computers) {    
        $computerLob = $computer.lob
        $lobApps = $apps | ? {$_.lob -eq $computerLob }
        foreach($app in $lobApps){
          $computerHostname = $computer.hostname
          $appLocation = $app.location
          $installed=Test-Path "\\$computerHostname\$appLocation"      
          New-Object PSObject @{Computer=$computer.hostname;App=$app.appname;Installed=$installed} 
        }
      }
    }
    
    MyFunction | select Computer,App,Installed
    

    证明上述内容的简化测试用例应该有效:

    function MyFunction(){
      New-Object PSObject -Property @{
        Computer="computer"
        App="app"
        Installed="installed"
      }
    }
    
    MyFunction | select Computer,App,Installed
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-10
      • 1970-01-01
      • 1970-01-01
      • 2022-07-20
      • 2022-01-21
      • 2021-08-16
      • 1970-01-01
      相关资源
      最近更新 更多