【问题标题】:Powershell Export-CSVPowershell 导出-CSV
【发布时间】:2017-05-31 14:04:00
【问题描述】:

我只是在尝试将以下内容导出到 CSV 时遇到问题,我尝试将 Export-CSV 放入 Foreach-Object 循环中无济于事。

我想将服务器名称 $server 放在第一列,将描述 $description 放在第二列。

在早期版本中,我可以使用 Out-File -append .\outa.txt -InputObject $_.Name,$description 创建一个文本文件,但格式效果不佳。

$server = Get-ADComputer -Filter {OperatingSystem -Like "*Server*" -and Name -Notlike "*DOM*"} 
$server | ForEach-Object {
    $Reg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('LocalMachine',$_.Name) 
    $RegKey = $Reg.OpenSubKey("SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters")
    $description = $RegKey.GetValue("srvcomment") 
} | Export-Csv .\out1.csv

【问题讨论】:

    标签: powershell export-to-csv


    【解决方案1】:

    ForEach-Object相反的ForEach

    $server = Get-ADComputer -Filter {OperatingSystem -Like "*Server*" -and Name -Notlike "*DOM*"} 
    
    foreach($s in  $server){
    
        # replaced $_ with $s
        $Reg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('LocalMachine',$s.Name) 
        $RegKey= $Reg.OpenSubKey("SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters")
        $description = $RegKey.GetValue("srvcomment") 
    
       # casting as array is required to use +=
       # disclaimer: the array is destroyed and rebuilt on each run.
       [array]$myData += New-Object psobject -Property @{
            Server      = $s.Name
            Description = $description
       }
    }
    
    # If you want a CSV without the top info line, use the notypeinfo switch
    # Select-Object gives you the column order you want.
    $myData | Select-Object Server,Description | Export-Csv .\out1.csv -NoTypeInformation
    

    编辑 - 评论答案
    可以在不创建数组的情况下从循环内部执行此操作,但Export-CsvAFAIK 需要一个对象。

    ForEach-Object:

    $server = Get-ADComputer -Filter {OperatingSystem -Like "*Server*" -and Name -Notlike "*DOM*"} 
    $server | ForEach-Object {
        $Reg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('LocalMachine',$_.Name) 
        $RegKey = $Reg.OpenSubKey("SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters")
        New-object psobject -Property @{Server=$_.Name;Description=$RegKey.GetValue("srvcomment")} | Export-Csv .\out1.csv -NoTypeInformation
    } 
    

    ForEach:

    $server = Get-ADComputer -Filter {OperatingSystem -Like "*Server*" -and Name -Notlike "*DOM*"} 
    foreach($s in  $server){
        $Reg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('LocalMachine',$s.Name) 
        $RegKey= $Reg.OpenSubKey("SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters")
        New-object psobject -Property @{Server=$s.Name;Description=$RegKey.GetValue("srvcomment")} | Export-Csv .\out1.csv -NoTypeInformation
    }
    

    如果您对值有疑问,括号/子表达式可以提供帮助:

    New-object psobject -Property @{Server=($_.Name);Description=($RegKey.GetValue("srvcomment"))} | Export-Csv .\out1.csv -NoTypeInformation
    New-object psobject -Property @{Server=$($_.Name);Description=$($RegKey.GetValue("srvcomment"))} | Export-Csv .\out1.csv -NoTypeInformation
    

    【讨论】:

    • 这对我有用,谢谢。是否可以在不创建数组的情况下做到这一点?似乎是一个额外的步骤 - 必须有一种方法可以在循环中放置输出。
    • @yoscar 查看编辑。最后也搞砸了ForEach-Object
    【解决方案2】:

    您的 ForEach-Object 仅包含语句(变量赋值)。它没有返回任何东西。你需要返回一些东西,否则你会将一个空管道传递给Export-CSV

    我猜,您实际想要做的是在名为 @987654325 的 CSV 中创建列,而不是设置名为 $Reg$RegKey$description 的变量(然后从不使用它们的值) @、RegKeydescription。在这种情况下,您希望每次循环都生成一个[PSCustomObject](添加了这些属性)。

    $server = Get-ADComputer -Filter {OperatingSystem -Like "*Server*" -and Name -Notlike "*DOM*"} 
    $server | ForEach-Object {
        [PSCustomObject] @{
            Reg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('LocalMachine',$_.Name) 
            RegKey = $Reg.OpenSubKey("SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters")
            description = $RegKey.GetValue("srvcomment") 
        }
    } | Export-Csv .\out1.csv
    

    【讨论】:

      猜你喜欢
      • 2016-10-23
      • 1970-01-01
      • 2013-10-11
      • 2014-12-04
      • 2018-06-22
      • 2017-07-03
      • 2021-02-17
      • 1970-01-01
      相关资源
      最近更新 更多