Как получить только часть из строки - PullRequest
0 голосов
/ 07 октября 2019

мы хотим приостановить виртуальную машину в Oracle VirtualBox, когда она используется во внутренней сети, и когда мы перечисляем виртуальные машины, я получаю вывод ниже, но для приостановки виртуальной машины мне нужно иметь только имена виртуальных машин, поскольку люди будут создаватьих собственные виртуальные машины, поэтому не могу назвать их конкретно. Проблема только в том, что мои навыки в PowerShell не так уж велики, и когда я пытаюсь использовать split или replace, я сталкиваюсь с ошибкой, связанной с пробелами в пышных скобках, и что я хочу закончить, это просто имя виртуальной машины WIN10_VM1, но какполучить это?

"WIN10_VM1" {bd9e16dc-1a1a-4340-aed2-af3b72f25c4f}
"win2019" {20fb95cb-2fb3-48f8-a69d-a1e00ca014b5}

Ответы [ 3 ]

0 голосов
/ 07 октября 2019

Спасибо, Пим, за то, что указал мне правильное направление. Теперь я получил вывод только имен виртуальных машин с помощью приведенных ниже команд, поэтому теперь я могу работать над следующим шагом сценария:)

$vms = & "C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" list vms| ForEach-Object { $_.Substring(0, $_.IndexOf("{")) }
$test = $vms -replace '[\W]', ''
$test

Вывод:

WIN10_VM1
win2019

0 голосов
/ 07 октября 2019

Для реализации решения регулярных выражений вы можете использовать -replace или Select-String.


Используя Select-String:

($vms | Select-String -Pattern '(?<=^")[^"]+').Matches.Value

Использование -replace с группами захвата:

$vms -replace '^"([^"]+)".*','$1'

Regex Объяснение:

  • (?<=^"):Положительный взгляд за утверждением (?<=), что первый символ в строке ".
  • [^"]+: соответствует одному или нескольким (+) символам, которые не ".
  • .*: сопоставляет все символы, кроме новой строки.

Использование скобок ([^"]+) определяет совпадение [^"]+ в качестве группы захвата. Поскольку он не назван, он становится группой захвата 1. При установке строки замены с помощью оператора -replace вы можете получить доступ к группам захвата. $1 представляет группу захвата 1 и должна быть заключена в одинарные кавычки или обратная черта, если между двойными кавычками. Это сделано для того, чтобы PowerShell не выполнял интерполяцию на $1.

0 голосов
/ 07 октября 2019

PowerShell предоставляет всю среду .NET. Таким образом, вы можете использовать метод Sytem.String.Substring () .

& "C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" | ForEach-Object { $_.Substring(0, $_.IndexOf("{")).Replace(" ", "") }
...