powershell - 如何在 PowerShell 的 Select-Object 中使用 Sort-Object 和 Where-Object?
问题描述
我正在为 Azure PowerShell 3.1.0 编写一个 PowerShell 脚本:
- 从 JSON 获取内容
- 根据MigratedFlag ='Y'的条件循环内容并按升序排序
OrderNo
Location
从使用执行 SQL 文件Invoke-Sqlcmd
- 如果我的值位置等于执行的脚本,则更新MigratedFlag =N
我可以执行除第 2步之外的所有步骤,即按 OrderNo 排序并在 MigratedFlag 上添加条件,
下面是一段 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 脚本(无法使用Sort-Object
也不Where-Object
在Select-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'
推荐阅读
- matrix - 将自定义矩阵转换为 PxTransform 的 Physx 3.4 (Linux) 问题
- excel - 使用 VBA 将公式插入 Excel 时预期语句结束错误
- java - containsKey() 总是返回 true
- c# - 通过 system.io 扫描我的 C:\ 驱动器时出现问题
- build - 错误:CSS 缩小错误:JisonLexerError:第 1 行的词法错误:无法识别的文本
- javascript - VSCode 在调试时不运行修改过的文件
- python - 从Python中的字典列表中提取多个键/值对的最有效方法?
- python - 如何在 Python 中沿圆形路径粘贴图像?
- javascript - Javascript:一个对象怎么可能是假的?
- excel - 将 Excel SUMPRODUCT 与多条件 COUNTIF 相结合