找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 16009|回复: 8

[技术讨论] PowerShell如何将hash表的键值拼在一起?

[复制链接]
发表于 2023-12-18 13:55:43 | 显示全部楼层 |阅读模式
我想把哈希表中的键和值用&拼在一起, 像下面这样子, 下面的代码可以实现, 但在 &拼接的地方, 如果要拼的文本很长时就有点慢, 有更简洁更高效的方法吗?
name=Divid&age=23
  1.         $bodyParams = @{
  2.                 name = "Divid"
  3.                 age  = "23"
  4.                 # 下面还有很多
  5.         }
  6.        
  7.         $body = ""
  8.         foreach ($key in $bodyParams.Keys)
  9.         {
  10.                 $value = $bodyParams[$key]
  11.                 $body += "$key=$value&"
  12.         }
  13.         $body = $body.TrimEnd('&')
复制代码
发表于 2023-12-18 14:34:09 | 显示全部楼层
字符串拼接慢可以用stringbuilder
但问题是,key value应该需要encodeuri吧,而且url好像有长度限制,不会太长应该也不会慢太多的
 楼主| 发表于 2023-12-18 14:41:05 | 显示全部楼层
本帖最后由 小白龙 于 2023-12-18 14:42 编辑

回复 2# wanghan519

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

怎样用 用stringbuilder 拼接数组字符串?
发表于 2023-12-18 15:16:50 | 显示全部楼层
回复 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 '&'
复制代码

评分

参与人数 1技术 +1 收起 理由
小白龙 + 1 乐于助人

查看全部评分

发表于 2023-12-19 01:35:00 | 显示全部楼层
hash好像不能控制遍历顺序

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

评分

参与人数 1技术 +1 收起 理由
小白龙 + 1 乐于助人

查看全部评分

 楼主| 发表于 2023-12-19 03:16:33 | 显示全部楼层
本帖最后由 小白龙 于 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:01 | 显示全部楼层
回复 4# wanghan519


感谢大佬分享,

"${qs_key}=${qs_value}"  和  "$(qs_key)=$(qs_value)"  有什么区别吗?
发表于 2023-12-19 03:58:21 | 显示全部楼层
回复 7# 小白龙


    圆括号里是要执行的代码,花括号里是变量名
"$($x)"应该等于"${x}",但"$(x)"会报错找不到x命令
发表于 2023-12-23 05:05:31 | 显示全部楼层
回复 6# 小白龙


    加上[ordered]就不是hash,是OrderedDictionary了,foreach和#foreach大概都是调用对象的枚举接口,速度都差不多
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 05:08 , Processed in 0.021832 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表