Как читать данные ячейки в 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