Powershell导出CSV

Powershell导出CSV,powershell,export-to-csv,Powershell,Export To Csv,我只是在尝试将以下内容导出到CSV时遇到问题,我尝试将导出CSV放在Foreach对象循环中,但没有效果 我想把服务器名$server放在第一列,把描述$description放在第二列 在早期版本中,我可以使用Out file-append.\outa.txt-InputObject$\uuName.$description创建文本文件,但格式设置不太好 $server = Get-ADComputer -Filter {OperatingSystem -Like "*Server*" -an

我只是在尝试将以下内容导出到CSV时遇到问题,我尝试将
导出CSV
放在
Foreach对象
循环中,但没有效果

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

在早期版本中,我可以使用
Out file-append.\outa.txt-InputObject$\uuName.$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

ForEach对象相对的
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 Csv
AFAIK需要一个对象

ForEach对象

$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

ForEach对象仅包含语句(变量赋值)。它没有归还任何东西。您需要返回一些内容,否则将传递一个空管道到
导出CSV

我猜,与其设置名为
$Reg
$RegKey
$description
(并且永远不要使用它们的值)的变量,您实际上要做的是在CSV中创建名为
Reg
RegKey
description
的列。在这种情况下,您希望每次通过循环生成一个
[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

那对我有用,谢谢。在不创建数组的情况下是否可以执行此操作?似乎是一个额外的步骤-必须有一种方法在循环中放置输出。@请参见编辑。最后,我也在处理
ForEach对象