2017-07-13 17 views
1

私はPowerShellを使用してCSVで単純なタスクを実行しようとしていますが、実際には機能しません。PowerShellでCSVを検索する

私はこのようなCSVファイルを持っています。

 
Name LineUri      Status   BusinessUnit Location 
Test 1 tel:+61396176100;ext=6100 Spare   Sales  VIC 
Test 2 tel:+61396176101;ext=6101 Spare   Sales  VIC 
Test 2 tel:+61396176102;ext=6102 Spare   Support  NSW 
Test 2 tel:+61396176103;ext=6103 Used   WareHouse SA 
Test 2 tel:+61396176104;ext=6104 Used   Sales  SA 
Test 2 tel:+61396176105;ext=6105 Spare   Support  VIC 
Test 2 tel:+61396176106;ext=6106 Spare   WareHouse VIC 
Test 2 tel:+61396176107;ext=6107 Spare   Support  VIC 

ロケーションに基づいてステータスが「予備」であるLineUriを検索しようとしています。

ので基準は、次のようになります。

 
Status = "Spare" 
BusinessUnit = "WareHouse" 
Location = "VIC" 

これは私を返す必要があります "TEL:61396176106; EXT = 6106" スペアとして。

このスペアLineUriを取得すると、別のロジックが実行され、その特定のLineUriのステータスが「Used」に変更されます。

私はlineUriを与えているこのコードを持っていますが、私はForEach-Objectループからその戻り値をどのように取り出して、別の関数で使用することができないのか分かりません。

$path  = Split-Path -parent $MyInvocation.MyCommand.Definition 
$newpath = $path + "\PhoneData.csv" 
# Array of spare numbers that meet your criteria 
$firstAvailableSpare 

# criteria 
$currentStatus = "Spare" 
$userBusinessUnit = "WareHouse" 
$userLocation = "VIC" 

$csv = Import-Csv $newpath -Delimiter "," 

$csv | ForEach-Object { 
    $Status += $_.Status 
    $BusinessUnit += $_.BusinessUnit 
    $Location += $_.Location 

    if (($_.Status -eq $currentStatus) -and ($_.BusinessUnit -eq $userBusinessUnit) -and ($_.Location -eq $userLocation)) { 
     $firstAvailableSpare = $_ # Assign the first 
     break # break the loop so we don't get additional hits 
    } 
} 

try { 
    #use the return value and update the csv so that its status is changed to Used 
} catch { 
    #do something else if failed 
} 

答えて

2

複数のフィールドに基づいてCSVから行を選択するWhere-Objectフィルタを使用し、結果を制限するためにSelect-Objectを使用しています。

あなたはこのようにそのLineUriで行を変更することができます
$firstAvailableSpare = $csv | Where-Object { 
    $_.Status -eq $currentStatus -and 
    $_.BusinessUnit -eq $userBusinessUnit -and 
    $_.Location -eq $userLocation 
} | Select-Object -Expand LineUri -First 1 

foreach ($row in $csv) { 
    if ($row.LineUri -eq $firstAvailableSpare) { 
     $row.Status = 'Used' 
    } 
} 
+0

しかし、私はこの回線URIを使用したら、どのように私はそのLineUriのステータスを更新してください。.. –

+0

あなたは私がどのように知らせてくださいすることができ返されたLineUriのステータスを更新できます –

+0

だから私は$ csv | Export-Csv -Path $ newpath -NoTypeInformation、私はまだスペアとしてそのLineUriを取得します –

関連する問題