PowerShell 7+如何将QueryString格式字符串解析为哈希表?
问题描述
希望暂时避开.NET Core中繁琐的查询字符串解析类,给定字符串:
$data = 'id=1&name=neil&language=powershell'
需要转换成如下格式的哈希表:
@{ id = 1 name = 'neil' language = 'powershell' }
尝试过以下代码:
$data -split '&' | ConvertFrom-StringData
但得到的是哈希表数组,因为ConvertFrom-StringData要求输入单个换行分隔的字符串。于是又尝试:
$data -replace '&','`n' | ConvertFrom-StringData
这种方法既不优雅,也无法正常工作。
在最终编写for循环之前,有没有更符合PowerShell惯用风格的实现方式?
补充内容
等待期间已经实现了如下代码,但并不满意:
$ht = @{} $data -split '&' | ForEach-Object { $kvp = $_ -split '=' $ht[$kvp[0].Trim()] = if ($kvp.Length -gt 1) { $kvp[1].Trim() } else { $null } }
(注:之前误将转义字符写成反斜杠,实际测试用的是反引号,在此致歉。)
解决方案
这里提供几种更符合PowerShell惯用风格的实现方式:
方法一:修正ConvertFrom-StringData的使用方式
ConvertFrom-StringData需要的是实际换行符,而非转义的`n(转义字符仅在双引号字符串解析时生效)。可以用双引号包裹的换行符或者系统环境换行符替换&:
# 用双引号解析换行符 $data -replace '&', "`n" | ConvertFrom-StringData # 用系统环境换行符,跨平台更友好 $data -replace '&', [Environment]::NewLine | ConvertFrom-StringData
两种写法都能直接生成单个哈希表,而非数组。
方法二:简化版ForEach-Object构建哈希表
你自己写的循环可以优化,用拆分次数限制和空值合并运算符让代码更简洁健壮:
$ht = @{} $data -split '&' | ForEach-Object { # 限制拆分次数为2,避免值中包含=符号时被错误拆分 $key, $value = $_ -split '=', 2 # 空值合并处理,确保无值时赋值为null $ht[$key.Trim()] = $value?.Trim() ?? $null }
方法三:纯管道式哈希表生成
如果偏好全程管道操作,可以先生成键值对对象,再转换为哈希表:
$ht = $data -split '&' | ForEach-Object { $_ -split '=', 2 | Select-Object ` @{Name='Key'; Expression={$_[0].Trim()}}, ` @{Name='Value'; Expression={$_[1]?.Trim() ?? $null}} } | Group-Object -AsHashTable -AsString -NoElement
这种写法适合需要先对键值对做额外处理的场景。
内容的提问来源于stack exchange,提问作者Neil Barnwell
相关产品推荐
相关产品推荐

