【问题标题】:Search CSV with PowerShell使用 PowerShell 搜索 CSV
【发布时间】:2017-12-18 04:41:16
【问题描述】:

我正在尝试使用 PowerShell 使用 CSV 执行简单的任务,但它真的不适合我。

我有这样的 CSV 文件。

名称 LineUri 状态 BusinessUnit Location 测试 1 电话:+61396176100;ext=6100 备用销售 VIC 测试 2 电话:+61396176101;ext=6101 备用销售 VIC 测试 2 电话:+61396176102;ext=6102 备用支持 NSW 测试 2 电话:+61396176103;ext=6103 Used WareHouse SA 测试 2 电话:+61396176104;ext=6104 二手销售 SA 测试 2 电话:+61396176105;ext=6105 备用支持 VIC 测试 2 电话:+61396176106;ext=6106 Spare WareHouse VIC 测试 2 电话:+61396176107;ext=6107 备用支持 VIC

我正在尝试根据位置搜索状态为“备用”的 LineUri。

所以标准是这样的:

状态 = “备用” BusinessUnit = "仓库" 位置 = “维克”

这应该将“tel:+61396176106;ext=6106”作为备用返回给我。

一旦我有了这个备用 LineUri,我就会执行另一个逻辑,然后将该特定 LineUri 的状态更改为“已使用”。

我有这段代码,它给了我 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
}

【问题讨论】:

    标签: powershell csv scripting powershell-2.0 export-to-csv


    【解决方案1】:

    使用Where-Object 过滤器根据多个字段从CSV 中选择行,并使用Select-Object 限制结果。

    $firstAvailableSpare = $csv | Where-Object {
        $_.Status -eq $currentStatus -and
        $_.BusinessUnit -eq $userBusinessUnit -and
        $_.Location -eq $userLocation
    } | Select-Object -Expand LineUri -First 1
    

    您可以像这样使用 LineUri 修改行:

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

    【讨论】:

    • 但是一旦我使用了这个 Line Uri,我该如何更新那个 LineUri 的状态..
    • 请告诉我如何更新返回的 LineUri 的状态
    • 所以当我做 $csv | Export-Csv -Path $newpath -NoTypeInformation ,我仍然得到那个 LineUri 作为 Spare
    • 我严重怀疑这一点。请提供证据。使用修改后的代码更新您的问题。
    • 发现问题,在foreach循环中,$$firstAvailableSpare应该是$firstAvailableSpare.LineUri
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-27
    • 2012-12-04
    • 2014-12-13
    • 1970-01-01
    相关资源
    最近更新 更多