使用Slmgr/dlv和Regex在第一个文本字符串实例后获取激活ID密钥



Slmgr/dlv提供任何给定计算机上的许可证列表。一个用于OS;ESU";关键,还有其他取决于您的系统。我正试图获取在文本"之后出现的激活ID的第一个实例;ESU";,所以我不会拿操作系统激活密钥或其他任何东西。

有了这个代码,我认为它是在抓取文本"之后的激活ID的第二个实例;ESU";或者它只是抓错了钥匙。我做错了什么?提前谢谢。

$Slmgr = cscript.exe C:Windowssystem32slmgr.vbs /dlv
switch -Regex ($slmgr | Out-String){'(?s)ESU.+Activation ID: (.+?)(?=r?n)'{
[PSCustomObject]@{
ActivationID = $Matches[1]
}
}
}

更新:这是下面slmgr/dlv的结果。它从操作系统密钥中获取激活ID的第一个实例,但现在它使用ESU从ESU部分获取正确的密钥。+?激活ID:\s*([^\r\n]+(。

http://imgur.com/gallery/BIJcyqM

但是,输出显示";名称";,以及";值";,我只需要单独模糊的#来稍后处理它。

http://imgur.com/gallery/gVPMeHM

更新

显然,在某些系统上,$Slmgr是一个数组,而不是多行字符串,所以-match不适用于多行regex。

我试过这个,但它在激活密钥后给了我一堆额外的信息:

$Slmgr = cscript.exe C:Windowssystem32slmgr.vbs /dlv
$Slmgr -match '(?s)ESU.+?Activation ID:s*([^rn]+)'
$Slmgr -join "'r'n" -match '(?s)ESU.+?Activation ID:s*([^rn]+)'
$ActivationID = $matches[1]

看看$ActivationID,它一开始确实有激活密钥,然后显示我代码中的"r’n",然后是后面的一堆东西,比如安装密钥、证书信息。我认为我加入我的代码会带来一些问题。

有什么想法我做错了什么,或者我试图实现的更好的方式吗?

您可以使用

$slmgr = cscript.exe C:Windowssystem32slmgr.vbs /dlv
$ActivationID = If ($slmgr -match '(?s)ESU.+?Activation ID:s*([^rn]+)') {$matches[1]} Else {""}

(?s)ESU.+?Activation ID:s*([^rn]+)正则表达式与匹配

  • 打开(?s)-RegexOptions.Singleline选项,使.也与换行符匹配
  • ESU-一个ESU子串
  • .+?-一个或多个字符,尽可能少
  • Activation ID:——一个字面短语
  • s*-零个或多个空白
  • ([^rn]+)-捕获组1:除CR和LF之外的任何一个或多个字符

关于更新,如果您的输入是一个数组,并且您需要将其转换为所需的字符串:

$slmgr = cscript.exe C:Windowssystem32slmgr.vbs /dlv
$slmgrString = $slmgr -join "`r`n"
$ActivationID = If ($slmgrString -match '(?s)ESU.+?Activation ID:s*([^rn]+)') {$matches[1]} Else {""}

最新更新