批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程
[批处理文件精品]批处理版照片整理器[批处理文件精品]纯批处理备份&还原驱动在线第三方下载
返回列表 发帖

[问题求助] PowerShell用A-Z的序号并以一定的格式来整理键值对

本帖最后由 小白龙 于 2022-11-15 10:21 编辑

每对键和值之间用 --- 分隔
键和值之间用一个空行分隔,键的内容是单行,值的内容是N行
我想把这些键值对, 用A-Z的序号整理一下, 如下图所示: 左侧是源键值对儿字符串, 右侧是整理后的效果
黑色字是固定不变的, 红色字是根据键值对儿的数量而变动的地方! 从A Av 开始, 到Z  Zv结束, 根据值键对的数量来决定
注意整理后: 键内容左边有1空格, 值内容每段的左边也有1空格
  1. $s= @'
  2. Key 1
  3. Hello 1
  4. World 1
  5. ---
  6. Key 2
  7. Hello 2
  8. World 2
  9. ---
  10. Key 3
  11. Hello 3
  12. World 3
  13. '@
  14. #PS代码
  15. <# 执行后结果如下:
  16. sss A=
  17. Key 1
  18. sss Av=
  19. Hello 1
  20. World 1
  21. Av.fff
  22. sss B=
  23. Key 2
  24. sss Bv=
  25. Hello 2
  26. World 2
  27. Bv.fff
  28. sss C=
  29. Key 3
  30. sss Cv=
  31. Hello 3
  32. World 3
  33. Cv.fff
  34. sss kv=
  35. @
  36. {A}={Av}
  37. {B}={Bv}
  38. {C}={Cv}
  39. DDD(kv)
  40. #>
复制代码

回复 1# 小白龙


下面代码可以循环输出A到Z的大写字母
  1. 97 .. 122 | %{ $s = [char]$_; $s.ToString().ToUpper() }
复制代码

TOP

  1. $a=65
  2. $s.split('---')|?{$_ -ne ''}|%{
  3. $b=$_.trim() -split '\n'
  4. $c=[char](++$a-1)
  5. '{0} {1} {2}' -f "sss","$c=`n",$i[0]
  6. "sss ${k}v="
  7. $b[1..$b.length]|%{" $_"}
  8. "${c}v.fff`n"
  9. }
复制代码

TOP

  1. $a = 65
  2. $s.split('---') | ?{ $_ -ne '' } | %{
  3. $b = $_.trim() -split '\n'|?{$_ -ne ''}
  4. $c = [char](++$a - 1)
  5. '{0} {1} {2}' -f "sss", "$c=`n", $b[0]
  6. "sss ${c}v="
  7. $b[1 .. $b.length] | %{ " $_" }
  8. "${c}v.fff`n"
  9. }
复制代码
1

评分人数

TOP

是这样吗

TOP

本帖最后由 idwma 于 2022-11-14 18:46 编辑

回复 8# 小白龙
  1. $a = 65
  2. $s.split('---') | ?{ $_ -ne '' } | %{
  3. $b = $_.trim() -split '\n'
  4. $c = [char](++$a - 1)
  5. '{0} {1} {2}' -f "sss", "$c=`n", $b[0]
  6. "sss ${c}v="
  7. $b[2 .. $b.length] | %{ " $_" }
  8. "${c}v.fff`n"
  9. }
  10. 'sss kv='
  11. '@'
  12. 65..($a-1)|%{' {{{0}}}={{{0}v}}' -f [char]$_}
  13. 'DDD(kv)'
复制代码

TOP

本帖最后由 idwma 于 2022-11-14 19:31 编辑

回复 10# 小白龙


    有空格也有空行呀

TOP

不会了   
.

TOP

回复 14# idwma


    我加了个&{} 输出的结果 貌似可以了, 但是有多余的空行
  1. &{
  2. $a = 65
  3. $s.split('---') | ?{ $_ -ne '' } | %{
  4. $b = $_.trim() -split '\n'
  5. $c = [char](++$a - 1)
  6. '{0} {1} {2}' -f "sss", "$c=`n", $b[0]
  7. "sss ${c}v="
  8. $b[2 .. $b.length] | %{ " $_" }
  9. "${c}v.fff`n"
  10. }
  11. 'sss kv='
  12. '@'
  13. 65 .. ($a - 1) | %{ ' {{{0}}}={{{0}v}}' -f [char]$_ }
  14. 'DDD(kv)'
  15. } > a.txt
复制代码

TOP

回复 14# idwma

多谢大佬, 上面你的代码是OK的, 是我用的软件的问题

TOP

本帖最后由 小白龙 于 2022-11-21 09:12 编辑

回复 6# idwma

大佬, 我把您的代码改了一下, 遇到一个问题:

最后那三行代码, 我想输出下面的效果,即: 每对儿之间加个[]连成一行
sss kv=@"{A}={Av}[]{B}={Bv}[]{C}={Cv}"

但不知为什么却输出成了下面, 即: []后面会有个空格, 怎么把空格删掉?
sss kv=@"{A}={Av}[] {B}={Bv}[] {C}={Cv}"

另外,21行开始的地方, 为了防止切片后有空行, 我使用了"\r\n---\r\n"
但总感觉代码还可以再改进一下
  1. cls
  2. $s = @'
  3. A Key
  4. -
  5. Hello 1
  6. World 1
  7. ---
  8. B Key
  9. -
  10. Hello 2
  11. World 2
  12. ---
  13. C Key
  14. -
  15. Hello 3
  16. World 3
  17. '@
  18. $ci = 65
  19. $s -split "\r\n---\r\n" | %{
  20. $b = $_ -split "\r\n-\r\n"
  21. $c = [char]$ci
  22. "sss $c=`r`n $($b[0])"
  23. "sss ${c}v="
  24. $b[1] -split "\r\n" | %{ " $_" }
  25. "${c}v.ffff`r`n"
  26. $ci++
  27. }
  28. $ar=@()
  29. 65 .. ($ci - 1) | %{ $ar += "{$([char]$_)}={$([char]$_)v}[]" }
  30. 'sss kv=@' + '"{0}"' -f "$ar".TrimEnd("[]")
  31. 'DDD(kv)'
复制代码

TOP

回复 6# idwma


   直接加引号好像不行, 只能用这个了

-join $ar

TOP

本帖最后由 idwma 于 2022-11-22 18:04 编辑
  1. $ofs=''
  2. 'sss kv=@' + '"{0}"' -f "$ar".TrimEnd("[]")
复制代码
加个出处
https://devblogs.microsoft.com/powershell/psmdtagfaq-what-is-ofs/
1

评分人数

TOP

回复 13# idwma

多谢大佬

TOP

回复 13# idwma


   大佬, 能帮看一下这个吗? 想用纯正则把---隔开的那三部分存到数组, 总感觉可以实现
http://www.bathome.net/thread-64431-1-1.html

TOP

返回列表