Вставить данные из Excel и преобразовать в массив? - PullRequest
0 голосов
/ 06 сентября 2018

Я новый PowerShell и хочу взять список серверов из Excel и буквально вставить в окно ввода. Это должно отделить это и обработать это один за другим.

т.е. дайте название сервера:

arvdel1
arvdel2
arvdel3
arvdel4

и это должно быть

$a=@(arvdel1,arvdel2,arvdel3,arvdel4)

Как я могу это сделать?

Ответы [ 6 ]

0 голосов
/ 30 мая 2019

Вы можете использовать обязательный параметр (для версий Powershell менее 5.1 или «Get-Clipboard» для версии 5.1 или выше), который имеет тип массива String [string []]. Вам будет предложено ввести значение каждого элемента массива, пока он не обнаружит введенную пустую строку.

Я понял это недавно, посмотрев на входные параметры скрипта. В течение многих лет я манипулировал текстом в формате однострочного массива PowerShell с транспонированием Excel и заменял символы «Tab» в Блокноте.

Только для справки. Формат однострочного массива PowerShell («1», «2», «3», «4», «5»)

...
param
(
    [parameter(Mandatory = $true)]
    [string[]]
    $listOfStrings
)
...

Пример запроса на заполнение строкового массива

Supply values for the following parameters:
listOfStrings[0]:

Я создал список в Блокноте (или Excel) с 1 по 5 и напрямую скопировал его в окно PowerShell. Ниже мой пример вывода.

1
2
3
4
5

Supply values for the following parameters:
listOfStrings[0]: 1
listOfStrings[1]: 2
listOfStrings[2]: 3
listOfStrings[3]: 4
listOfStrings[4]: 5
listOfStrings[5]:
1
2
3
4
5
0 голосов
/ 22 марта 2019

Я использую это в скриптах, которые требуют вставки списка имен компьютеров:

$MultilineInput = Read-Host "Enter List of Computer Names"

$PCQueryList = @"
$MultilineInput
"@ -split '\r\n'

Чтобы подтвердить, что ваш вставленный список является уникальным объектом, запустите $ PCQueryList.count и $ MultilineInput.count

arvdel1 arvdel2 arvdel3 arvdel4

$ $ PCQueryList.count 4

$ $ MultilineInput 1 * * +1010

0 голосов
/ 27 сентября 2018

$ cli = Read-Host («Войти на серверы») $ А = $ cli.Replace ( "` п", "") $ Ь = $ a.split ( "") foreach ($ i in $ b) { написать-хост "привет" }

о / р:

Введите серверы: 1.1.1.1 2.2.2.2 3.3.3.3 Привет Привет привет

0 голосов
/ 11 сентября 2018

Я получил решение. Мой скрипт будет принимать ввод из буфера обмена в виде массива и выполнять любую команду для каждого сервера. Все, что мне нужно сделать, это скопировать любое количество серверов из блокнота и запустить скрипт Образец: $ d = @ (Get-Clipboard) foreach ($ i in $ d) { Запись-вывод "Привет" }

0 голосов
/ 06 сентября 2018

Неясно, что вы ищете.

  • Вы просто не можете вставить диапазон ячеек Excel в консоль PowerShell, не получив кучу ошибок.
  • Сценарий PowerShell может ждать собственной подсказки, чтобы принять ввод,
    • 1-я проблема заключается в том, что один вход (Read-Host) будет завершен последовательностью cr/lf, которую Excel использует для разделения смежных ROW . Так что вам понадобится цикл, чтобы поймать все вставленные строки. Вторая проблема - вы не знаете, когда будут обработаны все строки.
    • При копировании диапазона с несколькими столбцами они TAB разделяются

Для обработки нераспознанного содержимого буфера обмена (текста) с использованием нескольких столбцов / строк, которые я бы использовал (как предложено в комментариях) Get-Clipboard и использование оператора разделения на основе RegEx с помощью ИЛИ для разделения на TAB или CR / LF

paste excel columns

> (Get-Clipboard) -split '\t|\r?\n'
arvdel1
arvdel2
arvdel3
arvdel4

paste excel rows

> (Get-Clipboard) -split '\t|\r?\n'
arvdel1
arvdel2
arvdel3
arvdel4

paste excel clumns and rows

> (Get-Clipboard) -split '\t|\r?\n'
arvdel1
arvdel2
arvdel3
arvdel4
arvdel2
C3
D3
E3
arvdel3
C4
D4
E4
arvdel4
C5
D5
E5

Вместо вывода на консоль вы, конечно, можете назначить переменную или напрямую добавить ForEach-Object для их обработки.

Редактировать: альтернативное чтение вышеуказанного файла Excel непосредственно из PowerShell
используя модуль ImportExcel DFinke :

> import-excel .\Data.xlsx

ServersCol
----------
arvdel1
arvdel2
arvdel3
arvdel4
0 голосов
/ 06 сентября 2018

Вот кусочки, которые вам нужны:

try {
    $excel = New-Object -ComObject Excel.Application
    $workbook = $excel.Workbooks.Open('E:\Temp\Data.xlsx')
    $xlSheet = $excel.Sheets.Item('Sheet1')
    $a = @($xlSheet.Range("A1:A4").Value2)
    #prefered to use named range
    #$xlSheet.Range("Items").Value2
} finally {
    $workbook.Close()
    $excel.Quit()
    [Runtime.InteropServices.Marshal]::ReleaseComObject($excel) | Out-Null
}

$a | sort | % {
  #process
  "Processing: $_"
}

Edit: Чтобы разбить строку, используйте -split:

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