2017-05-31 34 views
0

我只是有问题,试图将以下内容导出为CSV,我试过将Export-CSV置于Foreach-Object循环内无济于事。Powershell导出-CSPS

我想把第一列的服务器名称$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 

回答

1

一个ForEach作为反对ForEach-Object

$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-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 
+0

这对我的作品感谢。有没有可能做到这一点,而不创建一个数组?看起来像一个额外的步骤 - 必须有一种方法可以在循环中输出输出。 – yoscar

+0

@yoscar请参阅编辑。最后也会用'ForEach-Object'搞砸了 – gms0ulman

0

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

我猜测,而不是所谓的$Reg$RegKey设置变量,并$description(从来就不是用它们的值),你真正想要做的是建立在CSV列名为RegRegKeydescription。在这种情况下,您希望每次通过循环时产生一个[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