2017-03-07 39 views
1

私はPowerShellを使用してファイルCSVに8つの変数を記述しようとしているが、次のように,,,,,,,代わりのvar1,var2,var3,var4,var5,var6,var7,var8変数を使用してCsvをエクスポートするにはどうすればよいですか?

私のコードがあるとして、それがちょうど終わる:-Forceなし

$newRow = "{0},{1},{2},{3},{4},{5},{6},{7}" -f $var1,$var2,$var3,$var4,$var5,$var6,$var7,$var8 
$newRow = $newRow -Replace "`t|`n|`r","" 
$newRow = $newRow -Replace " ;|; ",";" 
$newRow += "`n" 
$newRow | Export-Csv -Path $file -Append -noType -Force 

私は次の取得エラーメッセージ:

Export-Csv : Cannot append CSV content to the following file: C:\result.txt. The 
appended object does not have a property that corresponds to the following column: 
var1. To continue with mismatched properties, add the -Force parameter, and then 
retry the command. 
At C:\Test.ps1:72 char:12 
+  $newRow | Export-Csv -Path $file -Append -noType 
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : InvalidData: (var1:String) [Export-Csv], InvalidOperationException 
    + FullyQualifiedErrorId : CannotAppendCsvWithMismatchedPropertyNames,Microsoft.PowerShell.Commands.ExportCsvCommand

EDIT:

スクリプト:

$startInfo = New-Object System.Diagnostics.ProcessStartInfo 
$startInfo.FileName = "powershell.exe" 
$startInfo.Arguments = 'C:\zabbix\script\zabbix_vbr_job.ps1 "Discovery"' 

$startInfo.RedirectStandardOutput = $true 
$startInfo.UseShellExecute = $false 
$startInfo.CreateNoWindow = $false 
#$startInfo.Username = "DOMAIN\Username" 
#$startInfo.Password = $password 

$process = New-Object System.Diagnostics.Process 
$process.StartInfo = $startInfo 
$process.Start() | Out-Null 
$discoveryJson = $process.StandardOutput.ReadToEnd() 
$process.WaitForExit() 
cls 

$discovery = $discoveryJson | ConvertFrom-Json 
$file = "C:\zabbix\script\result.txt" 

function RunScript ($param, $id) 
{ 
    $startInfo = New-Object System.Diagnostics.ProcessStartInfo 
    $startInfo.FileName = "powershell.exe" 
    $startInfo.Arguments = "C:\zabbix\script\zabbix_vbr_job.ps1 '$param' '$id'" 

    $startInfo.RedirectStandardOutput = $true 
    $startInfo.UseShellExecute = $false 
    $startInfo.CreateNoWindow = $false 

    $process = New-Object System.Diagnostics.Process 
    $process.StartInfo = $startInfo 
    $process.Start() | Out-Null 
    $output = $process.StandardOutput.ReadToEnd() 
    $process.WaitForExit() 

    return $output 
} 

$fileContent = Import-csv $file 

$NewCSVObject = @() 
foreach($obj in $discovery.data) 
{ 
    $index = [array]::indexof($discovery.data, $obj) 
    Write-Host $index "/" $discovery.data.count 
    #Write-Host (RunScript "Result" $obj.JOBID) 
    $Result = RunScript "Result" $obj.JOBID 
    #Write-Host $Result 
    $RunStatus = RunScript "RunStatus" $obj.JOBID 
    #Write-Host $RunStatus 
    $IncludedSize = RunScript "IncludedSize" $obj.JOBID 
    #Write-Host $IncludedSize 
    $ExcludedSize = RunScript "ExcludedSize" $obj.JOBID 
    #Write-Host $ExcludedSize 
    $VmCount = RunScript "VmCount" $obj.JOBID 
    #Write-Host $VmCount 
    $Type = RunScript "Type" $obj.JOBID 
    #Write-Host $Type 
    $RunningJob = "RunningJob"#RunScript "RunningJob" $obj.JOBID 
    #Write-Host $RunningJob 

    #$newRow = New-Object PsObject -Property @{ JobID = $obj.JOBID ; Result = $Result ; RunStatus = $RunStatus ; IncludedSize = $IncludedSize ; ExcludedSize = $ExcludedSize ; VmCount = $VmCount ; Type = $Type ; RunningJob = $RunningJob } 
    $newRow = "{0},{1},{2},{3},{4},{5},{6},{7}" -f $obj.JOBID,$Result,$RunStatus,$IncludedSize,$ExcludedSize,$VmCount,$Type,$RunningJob 
    $newRow = $newRow -Replace "`t|`n|`r","" 
    $newRow = $newRow -Replace " ;|; ",";" 
    $newRow += "`n" 
    #$newRow | Out-File $file 
    #[io.file]::WriteAllText("C:\zabbix\script\test.txt",$newRow) 
    Write-Host $newRow 
    $newRow | Export-Csv -Path $file -Append -noType 
    break 
} 
#cls 
Write-Host $fileContent 

CSVヘッダ:あなたはとにかく手でCSVラインを構築している場合

JobID,Result,RunStatus,IncludedSize,ExcludedSize,VmCount,Type,RunningJob
+0

あなたは '$ file'に含まれているものと' $ var'sの値が分かるようにスクリプトを完全に投稿してください。 '$ file'のファイルに既に何が入っているのかを知るのに役立つかもしれません。 – Bassie

+0

OP @Bassieを編集したばかりです –

+0

最小限の、完全で検証可能な例を作成する方法についてはリンクをご覧ください:http://上のstackoverflow.com/help/mcve。たとえば、 '$ discovery 'の値が何であるか、' zabbix_vbr_job.ps1'に含まれるものが何であるか分かりません。おそらく、 'Export-Csv'を呼び出すときに' $ obj'、 '$ result'などが実際に期待値を保持していることを確認するのがよいでしょう。私はこれを自分で確認することができないので、空白の ',,,,,,'出力が期待されるかどうかはわかりません。 – Bassie

答えて

6

Export-Csvを使用しても意味がありません。

どちらか

$newRow | Add-Content $file 

またはこのよう$newRowを構築するに

$newRow | Export-Csv -Path $file -Append -noType -Force 

を変更:

$newRow = New-Object -Type PSObject -Property @{ 
    'JobID'  = $var1 
    'Result'  = $var2 
    'RunStatus' = $var3 
    'IncludedSize' = $var4 
    'ExcludedSize' = $var5 
    'VmCount'  = $var6 
    'Type'   = $var7 
    'RunningJob' = $var8 
} 

、問題が消えます。


この現象の理由はExport-Csvは、それらの特性を表形式文字列表現にオブジェクトを変換するためのものであるということです。基本的に、オブジェクト

@{ 
    propertyA: 'foo' 
    propertyB: 23 
} 

propertyA,propertyB 
"foo","23"

すでに文字列を構築している場合は、その結果(文字列)オブジェクトのいずれかと一致していないだけで、単一のプロパティ(Length)を、持っているとなり既存のCSVのプロパティしたがって、あなたが-Forceなしで得ているエラー。 -Forceを使用しても、CSVに書き込まれたプロパティは、既存のCSVの最初の項目から決定されます。このセットに存在しないプロパティは出力から除外され、オブジェクトに存在しないそのセットのプロパティはNULL値で埋められます。

+0

それはそうでした、私はNew-Objectメソッドを使用し、今の魅力のように動作します:D –

関連する問題