Я системный администратор и пытаюсь научиться использовать PowerShell ... Я никогда раньше не создавал никаких сценариев или кодирования, и я учился онлайн, изучая центр скриптов technet и онлайн-форумы.
Я пытаюсь открыть электронную таблицу Excel, получить от нее информацию (имена пользователей и пароль), а затем вывести ее в командную строку в PowerShell. Когда я когда-либо пытаюсь это сделать, я все равно получаю исключение, вызывающее "InvokeMember", вот код, который у меня есть:
function Invoke([object]$m, [string]$method, $parameters) { $m.PSBase.GetType().InvokeMember( $method, [Reflection.BindingFlags]::InvokeMethod, $null, $m, $parameters,$ciUS ) }$ ciUS = [System.Globalization.CultureInfo] 'en-US'
$ objExcel = New-Object -comobject 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 "Фамилия:" $ Surname
$ objExcel.Quit () If (ps excel) {kill -name excel}
Я прочитал много разных сообщений на форумах и статей о том, как попытаться решить проблему en-US, но я не могу ее решить и надеюсь, что кто-то здесь может помочь!
Вот упомянутая мною проблема Exeption:
Exception calling "InvokeMember" with "6" argument(s): "Method 'System.Management.Automation.PSMethod.C:\PS\User Data.x ls' not found." At C:\PS\excel.ps1:3 char:33 + $m.PSBase.GetType().InvokeMember <<<< ( + CategoryInfo : NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId : DotNetMethodExceptionЧисло рабочих листов: нельзя вызвать метод для выражения с нулевым значением. В C: \ PS \ excel.ps1: 18 символов: 45 + $ objWorksheet = $ objWorkbook.Worksheets.Item <<<< (1) + CategoryInfo: InvalidOperation: (Item: String) [], RuntimeException + FullyQualifiedErrorId: InvokeMethodOnNull
Рабочий лист: нельзя вызвать метод для выражения с нулевым значением. В C: \ PS \ excel.ps1: 21 символ: 37 + $ Forename = $ objWorksheet.Cells.Item <<<< (2,1) .Text + CategoryInfo: InvalidOperation: (Item: String) [], RuntimeException + FullyQualifiedErrorId: InvokeMethodOnNull
Вы не можете вызвать метод для выражения с нулевым значением. В C: \ PS \ excel.ps1: 22 символа: 36 + $ Surname = $ objWorksheet.Cells.Item <<<< (2,2) .Text + CategoryInfo: InvalidOperation: (Item: String) [], RuntimeException + FullyQualifiedErrorId: InvokeMethodOnNull
Имя фамилия:
Это первый вопрос, который я когда-либо задавал, постарайтесь вести себя хорошо! :))
Большое спасибо
Максимум
Я попытался изменить код, и он вроде работает!
Вместо того, чтобы использовать
$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
P.S Я также сделал, как вы сказали, Массимо, и создал логин при переполнении стека и задал вопрос там!
Спасибо за помощь ребята
Ради интереса попробуйте изменить свой код, чтобы он работал с xls
файл, в имени которого нет пробела. Если это сработает, вам нужно экранировать пробел в имени файла в этой строке:
$objWorkbook = Invoke $objExcel.Workbooks.Open "C:\PS\User Data.xls"
или, возможно, укажите параметр в этом:
$m.PSBase.GetType().InvokeMember(
$method, [Reflection.BindingFlags]::InvokeMethod, $null, $m, $parameters,$ciUS )
Попробуйте использовать .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
спасибо за помощь ... Я устранил проблему! Я использовал PowerShell V2 CTP2, теперь я обновился до CTP3, это устранило проблему языкового барьера, и теперь я могу запускать сценарии, не беспокоясь о функции вызова, и все в порядке!
Большое спасибо
Максимум