[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[问题求助] PowerShell从多行字符串中提取变量名遇到的问题

我想从多行字符串中提取所有的变量名, 下面代码中的正则有点问题, 请高手指引, 提前感谢!
正确结果应该如下: 现在代码的结果中少了红色字的两个变量
$arr
$ii
$p12
$pro
$s
$s1
$s2
$x
  1. $s = @'
  2. $p12 = 'abc';
  3. $pro=New-Object System.Diag.Pr;
  4. $pro.Start = $false;
  5. $pro.Start.Red = $true; $s="hello"; $s1="world"; $s2="china"
  6. for ($x = 1; $x -lt 10; $x = $x + 1)
  7. {
  8.         echo $x
  9.         $s="word"
  10. }
  11. $arr = "Red", "Orange", "Green", "White", "Blue", "Indigo", "black", "Violet"
  12. for ($ii = 0; $ii -lt $arr.Length; $ii++)
  13. {
  14.         $arr[$ii]
  15. }
  16. '@
  17. $s | sls '(?m)(\$[a-zA-Z_][a-zA-Z0-9_]*)\s*=\s*.+' -AllMatches |
  18. foreach{
  19.         $_.matches |
  20.         foreach{
  21.                 $_.Groups[1].Value
  22.         }
  23. } |
  24. sort -Unique
复制代码
本人所发所有贴子或代码, 诸大侠若认为有改进之处,请不吝赐教,感激不尽!

回复 8# pd1

多谢指出:
变量名的$之前可能有 ( 或 ; 或空格
变量名后可能有 in 或 = 且到=之间不能有 .
变量名中第一个字符不能是数字
本人所发所有贴子或代码, 诸大侠若认为有改进之处,请不吝赐教,感激不尽!

TOP

回复 7# 5i365


    $a=dir *.txt;foreach($b in $a){write-host "前面是不是有个变量出不来"}

TOP

回复 6# pd1

不好意思, 这个例子, 就是自己给自己出题, 感觉有趣就尝试一下
如果后面有管道符, 感觉这个变量可能在前面赋值过了
本人所发所有贴子或代码, 诸大侠若认为有改进之处,请不吝赐教,感激不尽!

TOP

回复 3# 5i365


    所以举例子就要全面一点啊,用=也不一定吧  后面可以直接接管道符|的,没有=

TOP

找了点规律, 同时满足下面三个条件的正则就能匹配出来
-----------------------------------------------------------
变量名的$之前可能有 ( 或 ; 或空格
变量名到=之间不能有 .
变量名中第一个字符不能是数字
本人所发所有贴子或代码, 诸大侠若认为有改进之处,请不吝赐教,感激不尽!

TOP

我最上面的代码用上了sls, 是因为我看过到一篇文章, 这个sls命令比其它的方法速度都要快, 具体原因不明
本人所发所有贴子或代码, 诸大侠若认为有改进之处,请不吝赐教,感激不尽!

TOP

本帖最后由 5i365 于 2022-11-1 20:13 编辑

回复 2# pd1

多谢大侠支招, 但是有局限性,
例如下面我又在前面加了两行, 这两行不应该匹配到, 第一行中$abc是字符串, 第二行也不想匹配到, 所以还是得需要=号来约束一下
  1. $s = @'
  2. "$abc"
  3. $123
  4. $p12 = 'abc';
  5. $pro=New-Object System.Diag.Pr;
  6. $pro.Start = $false;
  7. $pro.Start.Red = $true; $s="hello"; $s1="world"; $s2="china"
  8. for ($x = 1; $x -lt 10; $x = $x + 1)
  9. {
  10.         echo $x
  11.         $s="word"
  12. }
  13. $arr = "Red", "Orange", "Green", "White", "Blue", "Indigo", "black", "Violet"
  14. for ($ii = 0; $ii -lt $arr.Length; $ii++)
  15. {
  16.         $arr[$ii]
  17. }
  18. '@
复制代码
本人所发所有贴子或代码, 诸大侠若认为有改进之处,请不吝赐教,感激不尽!

TOP

  1. $s = @'
  2. $p12 = 'abc';
  3. $pro=New-Object System.Diag.Pr;
  4. $pro.Start = $false;
  5. $pro.Start.Red = $true; $s="hello"; $s1="world"; $s2="china"
  6. for ($x = 1; $x -lt 10; $x = $x + 1)
  7. {
  8.         echo $x
  9.         $s="word"
  10. }
  11. $arr = "Red", "Orange", "Green", "White", "Blue", "Indigo", "black", "Violet"
  12. for ($ii = 0; $ii -lt $arr.Length; $ii++)
  13. {
  14.         $arr[$ii]
  15. }
  16. '@
  17. $reg=[regex]"\$[a-zA-Z0-9_]+"
  18. $reg.Matches($s)|select -Unique |?{$_.Value -ne '$false' -and $_.Value -ne '$true'}|%{$_.Value}
复制代码

TOP

返回列表