Как читать данные ячейки в Excel и выводить в командную строку

Я - системный администратор, и я пытаюсь научиться использовать PowerShell... Я никогда раньше не занимался написанием сценариев или написанием кода, и я учил себя онлайн, учась в центре сценариев Technet и на онлайн-форумах.

Я пытаюсь открыть электронную таблицу Excel, получить из нее информацию (имена пользователей и пароль), а затем вывести ее в командную строку в powershell. Всякий раз, когда я пытаюсь сделать это, я все равно получаю исключение, вызывающее InvokeMember, вот код, который у меня есть:

 
функция Invoke([объект]$m, [строка] $ метод, $ параметры)
{
$ M.PSBase.GetType (). InvokeMember ($ method, [Reflection.BindingFlags]:: InvokeMethod, $ null, $ m, $ parameters, $ ciUS)
}

$ ciUS = [System.Globalization.CultureInfo] 'en-US'

$ objExcel = Новый объект -объект Excel.Application $ objExcel.Visible = $ False $ objExcel.DisplayAlerts = $ False

$ objWorkbook = Invoke $ objExcel.Workbooks.Open "C: \ PS \ User Data.xls" Write-Host "Количество рабочих листов: " $ objWorkbook.Sheets.Count

$ objWorksheet = $ objWorkbook.Worksheets.Item (1) Write-Host "Рабочий лист: " $ objWorksheet.Name

$ Forename = $ objWorksheet.Cells.Item (2,1).Text $ Surname = $ objWorksheet.Cells.Item (2,2).Text

Write-Host "Имя: " $Forename Write-Host "Фамилия: " $ Фамилия

$objExcel.Quit() If (ps excel) { kill -name excel}

Я читал много разных постов на форумах и в статьях о том, как попытаться обойти проблему en-US, но, похоже, не могу обойти ее и надеюсь, что кто-то здесь может помочь!

Вот проблема исключения, которую я упомянул:

Исключение, вызывающее "InvokeMember" с аргументом (ами) "6": "Метод" System.Management.Automation.PSMethod.C:\PS\User Data.x
Я не найден."
В C:\PS\excel.ps1:3 char:33
+ $m.PSBase.GetType().InvokeMember <<<< (
    + CategoryInfo: NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId: DotNetMethodException

Числа рабочих листов: Вы не можете вызвать метод для выражения с нулевым значением. В C:\PS\excel.ps1:18 char:45 + $objWorksheet = $objWorkbook.Worksheets.Item <<<< (1) + CategoryInfo: InvalidOperation: (Item:String) [], RuntimeException + FullyQualifiedErrorId: InvokeMethodOnNull

Рабочий лист: Вы не можете вызвать метод для выражения с нулевым значением. В C:\PS\excel.ps1:21 char:37 + $Forename = $objWorksheet.Cells.Item <<<< (2,1).Text + CategoryInfo: InvalidOperation: (Item:String) [], RuntimeException + FullyQualifiedErrorId: InvokeMethodOnNull

Вы не можете вызвать метод для выражения с нулевым значением. В C:\PS\excel.ps1:22 char:36 + $ Фамилия = $objWorksheet.Cells.Item <<<< (2,2).Text + CategoryInfo: InvalidOperation: (Item:String) [], RuntimeException + FullyQualifiedErrorId: InvokeMethodOnNull

Имя фамилия:

Это первый вопрос, который я когда-либо задавал, постарайтесь быть милым!:))

Большое спасибо

Максимум

4 ответа

Я попытался изменить код, и у меня это получилось!

Вместо того, чтобы использовать

$objWorkbook = Invoke $objExcel.Workbooks.Open "C:\PS\User Data.xls"

Я забрал Workbooks.Open "C:\PS\User Data.xls" и создали переменную $file = "C:\PS\User Data.xls"

Сейчас пользуюсь

$objWorkbook = Invoke $objExcel.Workbooks Open($File)

И это почти работает! Теперь он не выдает никаких ошибок на меня, и вот результат в CMD

Numer of worksheets: 3
Worksheet: List Of Names
Forename:
Surname:

Но по какой-то причине он по-прежнему не отображает $Forename или $ Surname

PS Я также сделал, как вы сказали, Massimo, создал переполнение входа в стек и задал вопрос там!

Спасибо за помощь ребята

Просто для удовольствия, попробуйте изменить свой код для запуска с xls файл, в имени которого нет пробела. Если это работает, то вам нужно экранировать пробел в имени файла в этой строке:

$objWorkbook = Invoke $objExcel.Workbooks.Open "C:\PS\User Data.xls"

или, возможно, укажите параметр в этом:

$m.PSBase.GetType().InvokeMember(
$method, [Reflection.BindingFlags]::InvokeMethod, $null, $m, $parameters,$ciUS )

Спасибо за помощь... я исправил проблему! Я использовал PowerShell V2 CTP2, теперь я обновился до CTP3, это исправило проблему языкового барьера, и теперь я могу запускать сценарии, не беспокоясь о функции invoke, и все в порядке!

Большое спасибо

Максимум

Попробуйте использовать.Value2 вместо текста. Вот простой пример того, как открыть книгу Excel и прочитать значение:

$xl = New-Object -comobject Excel.Application
$wb = $xl.WorkBooks.Open("C:\temp\test.xls")
$ws = $wb.Worksheets.Item(1)
Write-Host $ws.Cells.Item(2,1).Value2
Другие вопросы по тегам