簡體   English   中英

Powershell導出CSV

[英]Powershell Export-CSV

我只是在嘗試將以下內容導出到CSV時遇到問題,我嘗試將Foreach-Object循環中的Export-CSV無效。

我想將服務器名稱$server放在第一列中,將描述$description放在第二欄中。

在較早的版本中,我能夠使用Out-File -append .\\outa.txt -InputObject $_.Name,$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

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

您的ForEach-Object僅包含語句(變量分配)。 它沒有返回任何東西。 您需要返回一些內容,否則,您要將空管道傳遞給Export-CSV

我猜想,您實際上想要做的是在CSV中創建名為RegRegKeydescription列,而不是設置名為$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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM