Как извлечь значение данных из массива и ввести как переменную - PullRequest
0 голосов
/ 08 ноября 2018

Я хотел бы загрузить CSV с сервером и ID для каждого сервера. Столбец 1 - имя сервера, столбец 2 - строка идентификатора. Там будет 40 серверов, каждый с определенной строкой идентификатора. В моем сценарии я хочу получить имя хоста, а затем найти его в моем массиве. Найдя, я хотел бы вывести идентификатор, соответствующий имени сервера, в переменную. Я очень новичок в PowerShell, поэтому, пожалуйста, имейте это в виду. Я лучше работаю с примерами, чтобы отработать.

$Server = @()
$ID = @()

Import-Csv C:\SecuredFiles\ID.csv | ForEach-Object {$Server += $_.Server ; 
$ID += $_.ID}

$ServerName = Invoke-Command -ScriptBlock {hostname}

if ($Server -contains $ServerName)
  {
    $Where = [array]::IndexOf($Server, $ServerName)
    $InputID = $ID[$Where]
  }

Start-Process -FilePath 'C:\MyFolder\App.exe' "-id $InputID -d C:\MyFolder"

Я копался в этом в течение нескольких часов, и я знаю, что я работаю усерднее, чем нужно, но я упрям ​​и люблю находить ответы самостоятельно, но я потерян и у меня мигрень, может быть, я делаю это совершенно неправильно, хотя.

Я пробовал это с различным форматированием, но получал разные ошибки, такие как «Отсутствие закрытия»} в блоке операторов или определение типа », хотя это было явно там. Моя текущая ошибка - «Блок операторов после if (условие)» для начала оператора «If». Любая помощь с благодарностью.

Ответы [ 2 ]

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

Проще и эффективнее импортировать CSV, а затем работать с экземплярами пользовательских объектов, возвращаемых им:

# Import into an array of custom objects ([pscustomobject]) that have
# both a .Server and an .ID property.
$serversAndTheirIds = Import-Csv C:\SecuredFiles\ID.csv

В частности, создание выходного массива итеративно с += очень эффективно,поскольку массивы являются неизменяемыми структурами данных, и "добавление" к ним означает, что новый массив должен выделяться за кулисами каждый раз.


Нетнеобходимо использовать Invoke-Command для синхронного вызова консольного приложения - просто вызовите приложение напрямую .

$ServerName = hostname # invoke hostname.exe and capture its output

Используйте командлет Where-Object илиметод PSv4 + .Where() для фильтрации коллекции:

$inputId = $serversAndTheirIds | Where-Object { $_.Server -eq $ServerName } | 
  Select-Object -ExpandProperty ID

Более эффективная альтернатива PSv4 +:

$inputId = $serversAndTheirIds.Where({ $_.Server -eq $ServerName }, 'First' }).ID

Опять же, синхронно вызовите другое консольное приложение, вызовите его напрямую:

C:\MyFolder\App.exe -id $InputID -d C:\MyFolder

Примечание. Если путь к исполняемому файлу указан , вам необходимоprepend & , оператор вызова .

ИспользованиеStart-Process только для вызова приложений с графическим интерфейсом или запуска программ асинхронно или скрыто .


Что касается вашего проблемы с синтаксисом :

Код, опубликованный в вашем вопросе на момент написания этой статьи, является синтаксически правильным и не приведет к сообщениям об ошибках, которые вы цитируете.

Вот что вызовет их :

Missing closing '}' in statement block or type definiton

Блок сценария ({...}) без закрывающего } вызовет эту ошибку;например, если ваш скрипт содержал только следующее:

 { 'foo'   # no closing '}'

Missing statement block after if ( condition )

оператор if, который не выполняетсяблоком скрипта вызовет эту ошибку;например, если ваш скрипт содержит только следующее:

 if ($true) # no script block ({ ... }) to follow the conditional
0 голосов
/ 08 ноября 2018

вот один из способов получить идентификатор системы из импортированного файла CSV ...

# fake reading in a CSV file
#    in real life, use Import-CSV
$InStuff = @"
Name, ID
Srv001, 1001
Srv002, 2002
Srv003, 3003
Srv004, 4004
Srv005, 5005
$env:COMPUTERNAME, 6006
Srv007, 7007
"@ | ConvertFrom-Csv

($InStuff -match $env:COMPUTERNAME).ID

вывод = 6006

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