Как читать конкретные переменные из строки, используя PowerShell? - PullRequest
0 голосов
/ 02 ноября 2018

Есть файл с таким содержанием

   SomeText1

   SomeCommand -parameterName abc -login def -password geh

   SomeText2

Не могли бы вы порекомендовать, какой должен быть PowerShell для считывания в массив переменных и значений (может быть как пара ключ / значение) для

 login=def
 password=geh

Особенность этого вопроса заключается в том, что порядок параметров имени для входа и пароля может отличаться, поэтому мне нужно найти способ найти ключ / значение на основе известного имени ключа. Кроме того, я знаю, что мне нужны только параметры логина и пароля и соответствующие значения.

Большое спасибо за помощь, заранее!

P.S. Я планировал использовать следующие команды для чтения содержимого файла, но это можно изменить:

$GetFileName = "$env:userprofile\Desktop\Folder\Input.txt" 

$content = [IO.File]::ReadAllText($GetFileName)

Ответы [ 2 ]

0 голосов
/ 02 ноября 2018

Командлет Select-String предлагает удобный способ использовать регулярные выражения для извлечения информации из файлов:

$inputFile = "$env:userprofile\Desktop\Folder\Input.txt"

# Extract the information of interest and output it as a hashtable.
# Use $ht = Select-String ... to capture the hashtable in a variable.
Select-String -Allmatches '(?<=-(login|password) +)[^ ]+' $inputFile |
  ForEach-Object {
    foreach ($match in $_.Matches) {
      @{ $match.Groups[1] = $match.Value }
    }
  }

При вводе примера выходные данные представляют собой одну хеш-таблицу (если совпадают несколько строк, вы получите хеш-таблицу для каждой строки):

Name                           Value
----                           -----
login                          def
password                       geh
  • -AllMatches указывает Select-String искать несколько совпадений в каждой строке.

  • Regex '(?<=-(login|password) +)[^ ]+' захватывает аргумент, связанный с параметрами -login и -password, при захвате имени параметра в группе захвата.

    • Обратите внимание, что регулярное выражение предполагает, что значения аргументов не имеют встроенных пробелов, но обычно это безопасное предположение в именах пользователей и паролях.
  • foreach ($match in $_.Matches) обрабатывает каждое совпадение, создает и выводит хеш-таблицу (@{ ... }), ключом которой является имя захваченного параметра, а значением - захваченный аргумент.

0 голосов
/ 02 ноября 2018

Вы можете использовать регулярные выражения для этого. Например, вот как вы можете извлечь параметры и аргументы из командной строки и вывести их как пользовательский объект (для упрощения манипуляции позже):

$cmd = "Some-Command -ParameterOne abc -ParameterTwo def -ParameterThree geh -SwitchParameter"

[Regex]::Matches($cmd, "-(?<param>\w+) (?<arg>\w*)|-(?<param>\w+)") |
    ForEach-Object {
        [PsCustomObject]@{
            Parameter = $_.Groups['param'].Value
            Argument = $_.Groups['arg'].Value
        }
    }

Вывод выглядит так:

Parameter       Argument
---------       --------
ParameterOne    abc     
ParameterTwo    def     
ParameterThree  geh     
SwitchParameter   

Что-то вроде Get-Content может подойти для чтения команды из файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...