Board logo

标题: [技术讨论] PowerShell如何将hash表的键值拼在一起? [打印本页]

作者: 小白龙    时间: 2023-12-18 13:55     标题: PowerShell如何将hash表的键值拼在一起?

我想把哈希表中的键和值用&拼在一起, 像下面这样子, 下面的代码可以实现, 但在 &拼接的地方, 如果要拼的文本很长时就有点慢, 有更简洁更高效的方法吗?
name=Divid&age=23
  1. $bodyParams = @{
  2. name = "Divid"
  3. age  = "23"
  4. # 下面还有很多
  5. }
  6. $body = ""
  7. foreach ($key in $bodyParams.Keys)
  8. {
  9. $value = $bodyParams[$key]
  10. $body += "$key=$value&"
  11. }
  12. $body = $body.TrimEnd('&')
复制代码

作者: wanghan519    时间: 2023-12-18 14:34

字符串拼接慢可以用stringbuilder
但问题是,key value应该需要encodeuri吧,而且url好像有长度限制,不会太长应该也不会慢太多的
作者: 小白龙    时间: 2023-12-18 14:41

本帖最后由 小白龙 于 2023-12-18 14:42 编辑

回复 2# wanghan519

感谢提醒, 我是用表单提交, 长度应该可以忽略

怎样用 用stringbuilder 拼接数组字符串?
作者: wanghan519    时间: 2023-12-18 15:16

回复 3# 小白龙


    据说:字符串连接时,每次都要重新申请空间,所以第一部分会被复制无数次,所以慢,stringbuilder可以扩展自身的空间,不会重复申请所以快一点,然后搜到下面的代码是用arraylist然后join,应该也是一样的,然后urlencode是为了消除url里的符号比如空格会变成%20,不知算不算画蛇添足
  1. $bodyParams = @{
  2.     name = "Divid"
  3.     age  = "23"
  4.     # 下面还有很多
  5. }
  6. [System.Collections.ArrayList] $qs_array = @()
  7. foreach ($qs in $bodyParams.GetEnumerator()) {
  8.     $qs_key = [System.Web.HttpUtility]::UrlEncode($qs.Name)
  9.     $qs_value = [System.Web.HttpUtility]::UrlEncode($qs.Value)
  10.     $qs_array.Add("${qs_key}=${qs_value}") | Out-Null
  11. }
  12. $qs_array -join '&'
复制代码

作者: Five66    时间: 2023-12-19 01:35

hash好像不能控制遍历顺序
  1. $bodyParams = @{
  2. name = "Divid"
  3. age  = "23"
  4. # 下面还有很多
  5. }
  6. $body=[System.Text.StringBuilder]::new()
  7. $bodyParams.Keys.foreach({
  8. $null=$body.append($_).append('=').append($bodyParams[$_]).append('&')
  9. })
  10. $body.tostring(0,$body.length-1)
复制代码

作者: 小白龙    时间: 2023-12-19 03:16

本帖最后由 小白龙 于 2023-12-19 03:17 编辑

回复 5# Five66


    感谢大佬分享, 关于顺序可以用下面的方式控制吧

另外, $bodyParams.Keys.foreach 和 foreach 两种方式, 哪个快? 怎样计时
  1. # 创建一个有序哈希表并添加键值对
  2. $orderedHash = [ordered]@{
  3.     key1 = "value1"
  4.     key2 = "value2"
  5.     key3 = "value3"
  6. }
  7. # 遍历有序哈希表
  8. foreach ($entry in $orderedHash.GetEnumerator()) {
  9.     Write-Host "$($entry.Key): $($entry.Value)"
  10. }
复制代码

作者: 小白龙    时间: 2023-12-19 03:36

回复 4# wanghan519


感谢大佬分享,

"${qs_key}=${qs_value}"  和  "$(qs_key)=$(qs_value)"  有什么区别吗?
作者: wanghan519    时间: 2023-12-19 03:58

回复 7# 小白龙


    圆括号里是要执行的代码,花括号里是变量名
"$($x)"应该等于"${x}",但"$(x)"会报错找不到x命令
作者: Five66    时间: 2023-12-23 05:05

回复 6# 小白龙


    加上[ordered]就不是hash,是OrderedDictionary了,foreach和#foreach大概都是调用对象的枚举接口,速度都差不多




欢迎光临 批处理之家 (http://bathome.net./) Powered by Discuz! 7.2