powershell从变量中提取字符串以分配另一个变量

时间:2019-11-22 21:53:54

标签: regex powershell

我想运行一个外部进程,并在PowerShell中的一个变量中捕获其命令输出。我目前正在使用此: 我将捕获"D:\reports\20191122_174015_hostname"然后分配给另一个变量。

$OutputVariable = (command) | Out-String

$ OutputVariable:

Gathering system informations
  Discovered server
  failed to 1 of 5 server, for details see: C:\TEST
failed.log
  Output for HOSTNAME at: C:\OUTPUT_11222019
Gather DONE
Execution time: 32 secs
To create a report for server, run one of the following:
  capacity   : test.exe --report --capacity "D:\reports\20191122_174015_hostname"
  traditional: test.exe --report --traditional "D:\reports\20191122_174015_hostname"

2 个答案:

答案 0 :(得分:0)

类似的事情应该起作用

$OutputVariable = Get-Process
$OutputVariable | Out-File -FilePath "D:\Program Files\tool\var\global\reports\20191122_174015_hostname"

答案 1 :(得分:0)

如果尝试从字符串中提取变化的路径,则将需要采用某种方法来仅识别该特定路径。在这种情况下,您可以使用orderBy创建正则表达式匹配条件。

-match

或者,也可以使用.NET Regex类中的$null = $OutputVariable -match 'capacity.*?"([^"]+)"' $Matches[1] 方法。

Match

说明:

  • [regex]::Match($outputvariable,'capacity.*?"([^"]+)"').Groups[1].Value 从字面上匹配容量
  • capacity匹配尽可能少的字符。这基本上使我们到达了容量后的第一个.*?字符。
  • "从字面上匹配"
  • "([^"]+)匹配非[^"]的所有内容,并且匹配一次或多次(")。 +创建一个捕获组,稍后我们可以参考。捕获组名为()

成功匹配将导致两个条目存储在自动变量1中。索引0是整个匹配字符串,索引1是第一个捕获组。由于您只想查看路径,因此我们仅从索引1检索数据。$Matches 如果没有匹配项将不会更新。因此它可以保留以前的匹配值。

$Matches用于禁止$null运算符的输出。

注意::这假设路径在某些点之前由双引号引起来,并在前面加上单词容量。实际上,您可能需要对此进行调整。