Как я могу использовать входной файл для подачи команды powershell? - PullRequest
0 голосов
/ 05 февраля 2019

У меня есть файл csv со следующей информацией (для удобства чтения я удалил запятые):

box1    1.1.1.1     user        password
box2    2.2.2.2     user        password
box3    3.3.3.3     user        password

Мне нужно выполнить команду с параметрами из файла csv, как показано ниже:

plink -l user -pw password 1.1.1.1 lsvdisk -delim , -nohdr

и введите файл с именем ящика в начале каждой строки.

Другими словами, у меня ~ 300 ящиков для хранения (V7k / SVC), и мне нужен инвентарь всех UUIDLUNs.Предпочтительно powershell.

1 Ответ

0 голосов
/ 05 февраля 2019

Import-Csv и ForEach-Object ваши друзья здесь:

Import-Csv -Header Host,Ip,User,Pw foo.csv | ForEach-Object {
  plink -l $_.User -pw $_.Pw $_.Ip lsvdisk -delim ',' -nohdr
}

Обратите внимание, что мы должны заключить в кавычки ,, чтобы он передавался как один параметр. ¹

В блоке сценария ForEach-Object $_ находится текущий объект, который имеет свойства из файла CSV.Мы должны были указать пользовательские заголовки для импорта, поскольку в вашем файле их нет.Если ваш файл выглядит не так, измените его соответствующим образом.

Это даст вам много выходных данных, из которых, возможно, имя хоста больше не доступно.В зависимости от того, как выглядит вывод, может иметь смысл разобрать его и обернуть в красивые объекты, но я не знаю, как выглядит вывод.Простой способ просто захватить выходные данные и связать их с именем хоста будет следующим:

Import-Csv -Header Host,Ip,User,Pw foo.csv | ForEach-Object {
  $output = plink -l $_.User -pw $_.Pw $_.Ip lsvdisk -delim ',' -nohdr
  New-Object PSObject -Property @{
    Host = $_.Host
    Output = $output
  }
}

Чтобы префиксировать каждую строку вывода именем хоста, вы можете снова зациклить вывод:

Import-Csv -Header Host,Ip,User,Pw foo.csv | ForEach-Object {
  $host = $_.Host
  plink -l $_.User -pw $_.Pw $_.Ip lsvdisk -delim ',' -nohdr | ForEach-Object {
    "${host}: $_"
  }
}

¹ Если в командной строке есть много вещей, которые PowerShell хочет интерпретировать сам, часто проще использовать %--, чтобы прекратить синтаксический анализ для остальной части строки после этого, который затем пропускает остальную частьдословно к внешним командам.

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