【问题标题】:How to use Sort-Object and Where-Object in Select-Object in PowerShell?如何在 PowerShell 的 Select-Object 中使用 Sort-Object 和 Where-Object?
【发布时间】:2020-07-19 11:14:32
【问题描述】:

我正在为 Azure PowerShell 3.1.0 编写一个 PowerShell 脚本:

  1. 从 JSON 中获取内容
  2. 根据 MigratedFlag='Y' 的条件循环浏览内容并按OrderNo 升序排序
  3. 使用Invoke-Sqlcmd 从Location 执行SQL 文件
  4. 如果我的值位置等于执行的脚本,则更新 MigratedFlag=N

除了第 2 步,我可以执行所有步骤,即按 OrderNo 排序并在 MigratedFlag 上添加条件,

这是 JSON 内容的 sn-p:

[
    {
        "OrderNo":  "1",
        "Location":  "ETS\\Stage_PS\\FS_PS_CUSTOMER.sql",
        "MigratedFlag":  "Y",
        "Description":  "Creation of STG_PS_FS.PS_CUSTOMER"
    },
    {
        "OrderNo":  "2",
        "Location":  "ETS\\Stage_PS\\FS_PS_CUST_ADDRESS.sql",
        "MigratedFlag":  "Y",
        "Description":  "Creation of STG_PS_FS.PS_CUST_ADDRESS"
    },
    {
        "OrderNo":  "3",
        "Location":  "ETS\\Stage_PS\\FS_PS_CUST_ADDR_SEQ.sql",
        "MigratedFlag":  "Y",
        "Description":  "Creation of STG_PS_FS.PS_CUST_ADDR_SEQ"
    }
]

以下是我正在使用的 PS 脚本(无法在 Select-Object 中使用 Sort-Object 或 Where-Object):

$v_JSON = Get-Content '$(system.defaultworkingdirectory)\xxxxx\BuildOrder.json' -raw | ConvertFrom-Json
$v_JSON | Select-Object -Property Location | ForEach {
$Script =  $_.Location
Write-Host "Executing Script"$Script
Invoke-Sqlcmd -ServerInstance "InstanceName" -Database $(database) -Username $(testauto_username)  -Password $(testauto_password) -InputFile $(system.defaultworkingdirectory)\$Script
$v_JSON | % {if($_.Location -eq $Script){$_.MigratedFlag='N'}}
$v_JSON | ConvertTo-Json -depth 32| set-content '$(system.defaultworkingdirectory)\xxxxx\BuildOrder.json'
}

【问题讨论】:

    标签: powershell powershell-3.0 azure-powershell select-object


    【解决方案1】:

    只需将它们插入到Select-Object之前的管道中:

    $v_JSON = Get-Content '$(system.defaultworkingdirectory)\xxxxx\BuildOrder.json' -Raw | ConvertFrom-Json
    $v_JSON | Sort-Object -Property OrderNo | Where-Object {$_.MigratedFlag -like 'Y'} | Select-Object -Property Location | ForEach {
        $Script =  $_.Location
        Write-Host "Executing Script"$Script
        Invoke-Sqlcmd -ServerInstance "InstanceName" -Database $(database) -Username $(testauto_username)  -Password $(testauto_password) -InputFile $(system.defaultworkingdirectory)\$Script
        $v_JSON | % {if($_.Location -eq $Script){$_.MigratedFlag='N'}}
        $v_JSON | ConvertTo-Json -depth 32| set-content '$(system.defaultworkingdirectory)\xxxxx\BuildOrder.json'
    }
    

    顺便说一句:您的 Select-Object -Property Location 没有那么有用,因为您必须在循环中再次遍历 $V_JSON 才能获得其他属性。我推荐以下优化:

    $v_JSON = Get-Content '$(system.defaultworkingdirectory)\xxxxx\BuildOrder.json' -Raw | ConvertFrom-Json
    $v_JSON | Sort-Object -Property OrderNo | Where-Object {$_.MigratedFlag -like 'Y'} | ForEach {
        $Script =  $_.Location
        Write-Host "Executing Script: $Script"
        Invoke-Sqlcmd -ServerInstance "InstanceName" -Database $(database) -Username $(testauto_username)  -Password $(testauto_password) -InputFile $(system.defaultworkingdirectory)\$Script
        $_.MigratedFlag = 'N'
    }
    $v_JSON | ConvertTo-Json -depth 32| set-content '$(system.defaultworkingdirectory)\xxxxx\BuildOrder.json'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-21
      • 1970-01-01
      • 2018-11-30
      • 2023-03-31
      相关资源
      最近更新 更多