如何在 PowerShell 的 Select-Object 中使用 Sort-Object 和 Where-Object?
How to use Sort-Object and Where-Object in Select-Object in PowerShell?
我正在为 Azure PowerShell 3.1.0 编写 PowerShell 脚本:
- 从JSON
获取内容
- 根据 MigratedFlag='Y' 的条件循环内容并按
OrderNo
升序排序
- 正在使用
Invoke-Sqlcmd
从 Location
执行 SQL 文件
- 如果我的位置值等于执行的脚本然后更新MigratedFlag=N
除了第 2 步,我可以执行所有步骤,即按 OrderNo 排序并在 MigratedFlag、[=19= 上添加条件]
这里是 JSON 内容的片段:
[
{
"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'
}
只需将它们插入管道之前 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'
我正在为 Azure PowerShell 3.1.0 编写 PowerShell 脚本:
- 从JSON 获取内容
- 根据 MigratedFlag='Y' 的条件循环内容并按
OrderNo
升序排序
- 正在使用
Invoke-Sqlcmd
从 - 如果我的位置值等于执行的脚本然后更新MigratedFlag=N
Location
执行 SQL 文件
除了第 2 步,我可以执行所有步骤,即按 OrderNo 排序并在 MigratedFlag、[=19= 上添加条件]
这里是 JSON 内容的片段:
[
{
"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'
}
只需将它们插入管道之前 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'