Как прочитать конкретное значение строки с аргументом, используя PowerShell? - PullRequest
1 голос
/ 02 апреля 2019

У меня есть файл с этим форматом.

English
Name
    Gerry
Class
    Elementry
ID Number
    0812RX
Gender
    *Male
     Female
Address
     St.Joseph Rd.78
Member Name
     Jack

Структура этого файла, значение Name, есть один enter и один tab, а затем значение Gerry

Я хочу прочитать значение каждого элемента. Я попробовал этот код.

Param(
  [parameter(mandatory=$true)][string]$FilePath, $Key
)

$FileContent = Get-Content $FilePath | Where-Object{"^($Key)","`$1$Value"}
$FileContent

Мое ожидание, когда я выполню эту команду

powershell.ps1 -FilePath file.txt -Key Name

Будет возвращено: Gerry

Пожалуйста, кто-нибудь, дайте мне идею. Спасибо

Ответы [ 2 ]

2 голосов
/ 02 апреля 2019

Лучше всего использовать оператор switch с параметром -File:

$found = $false
$value = switch -File file.txt {
  'Name' { $found = $true }
  default { if ($found) { $_.Substring(1); break } }
}

При вводе пробы $value должно содержать Gerry.

$found устанавливается на $true, если 'Name' найден в отдельной строке;в блоке default, который выполняется для всей другой строки, затем возвращается следующая строка без ее начального (табуляции) символа.

Оборачивается в сценарии с параметрами, смоделированными здесь с помощью блока сценариядля краткости:

# Create a sample file; "`t" creates a tab char.
@"
Name
`tGerry
Class
`tElementary
ID Number
`t0812RX
"@ > file.txt

# Script block that simulates a script file.
& {

  param(
    [Parameter(Mandatory)] [string] $FilePath,
    [Parameter(Mandatory)] [string] $Key
  )

  $found = $false
  switch -File $FilePath { 
    $Key { $found = $true }
    default { if ($found) { return $_.Substring(1) } }
  }

} -FilePath file.txt -Key Name

Выше приведено Gerry.

Обратите внимание, что если в имени вашего ключа есть пробелы, вы должны передать его в кавычках в сценарий;Например:

... -FilePath file.txt  -Key 'ID Number'
0 голосов
/ 02 апреля 2019

Когда вы делаете Get-Content, файл попадает в массив строк, на которые вы можете ссылаться.

Это предполагает, что ваши файлы имеют согласованный формат - они имеют одинаковое количество строк, а строки соответствуют полям, указанным в примере. Если нет, то можно что-то сделать с регулярными выражениями, но мы не будем сейчас вдаваться в это.

$file = (get-content c:\temp\myfile.txt).trim()
$lang = $file[0]
$name = $file[3]
$class = $file[5]
$idNo = $file[7]
if ($file[9] -match '`*') {$gender = "Male"}
if ($file[10] -match '`*') {$gender = "Female"}
$address = $file[12]

Затем вы можете присвоить полученные значения PSCustomObject или хеш-таблице. На самом деле, проще всего сделать это одновременно.

$student= [PsCustomObject]@{
    Lang = $file[0]
    Name = $file[3]
    Class = $file[5]
    ...
}

Я оставлю вывод атрибутов объекта в порядке, который вы описали, как упражнение для вашего собственного удовольствия!

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