8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

PowerShell JSON 文件在单个语句中排序数组不起作用

Yu Guan 2月前

87 0

在 PowerShell 5.1 中,我将 JSON 文件读入对象数组并按一个属性的降序对它们进行排序,但是当我使用单个语句时,排序不会保存到最终变量中……

在 PowerShell 5.1 中,我将 JSON 文件读入对象数组并按一个属性对其进行降序排序,但当我使用单个语句时,排序不会保存到最终变量中。将其分成两个语句是可行的,我很好奇为什么一个语句可行而另一个却不行。

这是我的代码:

作品:

$versions = Get-Content $jsonFilePath | Out-String | ConvertFrom-Json
$versions = $versions | Sort-Object -Descending -Property Version

无包:

$versions = Get-Content $jsonFilePath | Out-String | ConvertFrom-Json | Sort-Object -Descending -Property Version

编辑...

JSON:(文件中已经排序,但我们不假设)

[
    {
        "UIVersion":  "2024.21.5",
        "Version":  "12.5.1.1"
    },
    {
        "UIVersion":  "2024.20.15",
        "Version":  "12.5.1"
    },
    {
        "UIVersion":  "2024.20.10",
        "Version":  "12.5"
    },
    {
        "UIVersion":  "2024.20.9",
        "Version":  "12.3.6"
    },
    {
        "UIVersion":  "2024.20.7",
        "Version":  "12.3.6"
    },
    {
        "UIVersion":  "2024.20.1",
        "Version":  "12.3.6"
    },
    {
        "UIVersion":  "2024.20.6.2",
        "Version":  "12.3.6"
    },
    {
        "UIVersion":  "2024.20.100",
        "Version":  "12.3.6"
    },
    {
        "UIVersion":  "2024.20.200",
        "Version":  "12.3.6"
    },
    {
        "UIVersion":  "2024.20.9.1",
        "Version":  "12.3.6"
    },
    {
        "UIVersion":  "2024.26.3.1",
        "Version":  "12.3.6"
    }
]
帖子版权声明 1、本帖标题:PowerShell JSON 文件在单个语句中排序数组不起作用
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由Yu Guan在本站《powershell》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 我有两个独立的 Web 应用程序,即 App1 和 App2,它们具有不同的身份验证机制。我有另一个 Web 应用程序 App3,我可以使用 App1 或 App2 登录。如果用户是...

    我有两个独立的 Web 应用程序,分别称为 App1 和 App2,它们具有不同的身份验证机制。我还有另一个 Web 应用程序 App3,我可以使用 App1 或 App2 登录。如果用户已经登录并且浏览器选项卡中的 App1/App2 中会话处于活动状态,则我想通过新选项卡直接通过同一浏览器中的 URL 访问 App3。我计划在 OAuth 2.0 中使用令牌交换授予类型方法来实现这一点,其中来自 App1 或 App2 的 JWT 令牌在 App3 身份验证服务中进行验证和交换,以便可以使用交换的令牌访问 App3 资源。现在,要交换的 JWT 令牌驻留在 App1/App2 的浏览器本地存储中,它们位于不同的域中。在同一浏览器的新选项卡的地址栏中输入 App3 的直接 URL 的情况下,我需要检索 App1 或 App2 的 JWT 令牌以便与 App3 身份验证服务进行交换。有没有更好的方法可以通过安全的方式从另一个域中的另一个 Web 应用程序 (App1/App2) 获取 App3 中的令牌?我正在使用带有 IdentityServer4 的 Angular 前端和 .NET Core 后端。

  • 如果您想深入了解,幕后发生的事情是他们在 PowerShell 5.1 中默认使用 WriteObject(theParsedJson, enumerateCollection: false)。有关详细信息,请参阅 learn.microsoft.com/en-us/dotnet/api/…。

  • 我建议您可以考虑使用身份服务器的 SSO,您可以对其进行配置以识别这三个应用程序。

  • 是的,Out-String 不是必需的,如果您想读取文件单个字符串,请始终使用 -Raw。至于 -NoEnumerate 和它的必需性,情况恰恰相反,Sort-Object 将查看您作为参数 -Property 提供的属性值,但是如果没有枚举,Sort-Object 接收的不是“每个对象”,而是包含所有对象的单个数组,并且 cmdlet 并非旨在对管道中的单个数组进行排序。它旨在从管道中获取每个对象,收集它们,然后对它们进行排序。@Craig

  • 成功了,谢谢。我怀疑 Out-String 是不必要的。也许我是从别人那里抄来的。在阅读有关新的 -NoEnumerate 开关的信息后,我认为流水线排序不需要枚举即可工作。您能帮我理解为什么拥有整个数组(无枚举)会破坏流水线排序,而一次只有一个元素(枚举)会使其工作吗?还是我对枚举的理解不正确?

  • 这两个示例没有提供完全相同的输出,这 ConvertFrom-Json 在 Windows PowerShell 5.1 中非常具体,原因是 cmdlet 输出时没有枚举每个对象。在较新版本的 PowerShell 7+ 中,这种情况已不再存在, -NoEnumerate switch -NoEnumerate 开关

    为了克服这种行为,您可以将表达式括在括号中以强制从管道进行枚举。 Grouping operator ( ) 分组运算符()

    (Get-Content $jsonFilePath -Raw | ConvertFrom-Json) | Sort-Object Version -Descending
    
返回
作者最近主题: