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

[问题求助] PowerShell提取命令帮助文件中的示例

我想将某个命令帮助文件中的示例提取出来, 期待高手能支招, 提前感谢!
最下面的代码, 只提取出了示例的标题, 标题下有几行是示例, 很有规律, 正则提取: 标题行下有一个空行, 然后就是1行或多行连续的示例, 接着有一个空行

例如 get-Content 这个命令帮助的示例, 我节选了一些, 其中的蓝字部分就是示例


   ------------------ Example 6: Get raw content ------------------

    $raw = Get-Content -Path .\LineNumbers.txt -Raw
    $lines = Get-Content -Path .\LineNumbers.txt
    Write-Host "Raw contains $($raw.Count) lines."
    Write-Host "Lines contains $($lines.Count) lines."

    Raw contains 1 lines.
    Lines contains 100 lines.


    ----------- Example 7: Use Filters with Get-Content -----------

   Get-Content -Path C:\Temp\* -Filter *.log


    --------- Example 8: Get file contents as a byte array ---------

    $byteArray = Get-Content -Path C:\temp\test.txt -Encoding Byte -Raw
    Get-Member -InputObject $bytearray

    TypeName: System.Byte[]

    Name           MemberType            Definition
    ----           ----------            ----------
    Count          AliasProperty         Count = Length
    Add            Method                int IList.Add(System.Object value)

----------------------------------------------------------------------------------------------------------------------------
期待提取后的结果:

   ------------------ Example 6: Get raw content ------------------

    $raw = Get-Content -Path .\LineNumbers.txt -Raw
    $lines = Get-Content -Path .\LineNumbers.txt
    Write-Host "Raw contains $($raw.Count) lines."
    Write-Host "Lines contains $($lines.Count) lines."

    ----------- Example 7: Use Filters with Get-Content -----------

   Get-Content -Path C:\Temp\* -Filter *.log

    --------- Example 8: Get file contents as a byte array ---------

    $byteArray = Get-Content -Path C:\temp\test.txt -Encoding Byte -Raw
    Get-Member -InputObject $bytearray



----------------------------------------------------------------------------------------------------------------------------
  1. $c = "get-Content"
  2. ((get-help $c -Examples | Out-String) -split '\n') | foreach { $_.trim() } | sls ".+Example\s\d:.+"
复制代码
本人所发所有贴子或代码, 诸大侠若认为有改进之处,请不吝赐教,感激不尽!

  1. cls
  2. $r = Invoke-WebRequest -Uri ((gcm sc).HelpUri)
  3. $r.ParsedHtml.getElementsByTagName('h3') | Where-Object { $_.id -match '^example' } | foreach {
  4.     '------{0}------' -f $_.innerText
  5.     $ele = $_
  6.     while($ele.tagName -ne 'PRE'){ $ele = $ele.nextSibling }
  7.     $ele.innerText
  8. }
复制代码
1

评分人数

    • 5i365: 乐于分享, 技术牛X技术 + 1

TOP

本帖最后由 5i365 于 2022-4-27 07:02 编辑

回复 17# went


   感谢大侠帮忙, 测试了一下, 最后取的示例错了
链接
http://go.microsoft.com/fwlink/?LinkID=113392

取到的结果:
------Example 4: Use Filters with Set-Content------
The following command set the content all *.txt files in the C:\Temp directory to the Value empty.


应该取:
Set-Content -Path C:\Temp\* -Filter *.txt -Value "Empty"

规律是:如果一行开头包含 powershell  结尾包含复制,它的下一行就是要取的内容

本人所发所有贴子或代码, 诸大侠若认为有改进之处,请不吝赐教,感激不尽!

TOP

  1. cls
  2. $r = Invoke-WebRequest -Uri ((gcm sc).HelpUri)
  3. $r.ParsedHtml.getElementsByTagName('h3') | Where-Object { $_.id -match '^example' } | foreach {
  4.     '------{0}------' -f $_.innerText
  5.     $_.nextSibling.nextSibling.innerText
  6. }
复制代码
1

评分人数

TOP

回复 15# 5i365


    不会

TOP

回复 13# idwma


大侠好, win7和win10帮助系统还真是不统一, 上面的匹配正则不能通用, 现在突然有个新的想法, 就是获取在线帮助的示例, 看了一下, 非常有规律 一个示例标题, 一段代码, 如下图所示,
我已经用下面的代码, 获取到网页的内容了, 但是不知道怎么取示例的值, 感觉这个非常有挑战性, 貌似爬虫就是这一类的爬法

查了些资料, 好像说是用xpath定位到html元素, 然后就取到值了, 感觉应该能实现

$r = Invoke-RestMethod  (gcm sc).HelpUri
$r



本人所发所有贴子或代码, 诸大侠若认为有改进之处,请不吝赐教,感激不尽!

TOP

回复 13# idwma


好的, 到时候我看到国外的类似的例子, 把代码贴过来, 在讨论一下
本人所发所有贴子或代码, 诸大侠若认为有改进之处,请不吝赐教,感激不尽!

TOP

回复 12# 5i365


    那些功能好像在ps2.0上用不了,不通用就不去研究了

TOP

回复 11# idwma


  它 有一个  上下文 参数, 选择匹配前扣的行, 可能用不上,
最主要是可以同时用多个正则参数, 配合一下, 好像无所不能似的, 我对正则, 迷迷糊糊的, 一配合就更晕了

这个选择字符串很强大, 看到好多国外的贴子, 截取段落什么的, 都用的它, 很少用match什么的
本人所发所有贴子或代码, 诸大侠若认为有改进之处,请不吝赐教,感激不尽!

TOP

回复 10# 5i365


    用这个怎么判断多行?

TOP

回复 8# idwma


大侠, 总感觉, 用  select-string 能更好的解决问题,  因为它后面可以加, 多个模式匹配的字符串
Select-String [-Pattern] <String[]>
本人所发所有贴子或代码, 诸大侠若认为有改进之处,请不吝赐教,感激不尽!

TOP

回复 8# idwma


感谢大侠帮忙,
看来正则配合分组还是很有用, 很常见的, 多个示例, 都用到了group
本人所发所有贴子或代码, 诸大侠若认为有改进之处,请不吝赐教,感激不尽!

TOP

  1. $c = "get-Content"
  2. [regex]::matches($(get-help $c -Examples | Out-String),'(.+Example\s\d:.+\n\s*\n[\s\S]*?)\n\s*\n')|%{$_.groups[1].value}
复制代码
1

评分人数

    • 5i365: 技术牛X, 乐于分享技术 + 1

TOP

回复 6# idwma

哦, 我的是WIN7下的帮助

   https://send.cm/d/AM0K
本人所发所有贴子或代码, 诸大侠若认为有改进之处,请不吝赐教,感激不尽!

TOP

ps版本不一样输出的格式不一样,发个完整的help gc输出来看看

TOP

返回列表