我是一个系统pipe理员,我正在学习如何使用PowerShell …我从来没有做过任何types的脚本或编码之前,我一直在网上教学,通过从technet脚本中心和在线论坛学习。
我想完成的是打开一个Excel电子表格从它(用户名和密码)获取信息,然后输出到PowerShell的命令提示符。 当我试图做到这一点,我得到一个exception调用“InvokeMember”无论如何,这里是我到目前为止的代码:
函数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”
写主机“工作表数量:”$ objWorkbook.Sheets.Count
$ objWorksheet = $ objWorkbook.Worksheets.Item(1)
写主机“工作表:”$ objWorksheet.Name
$ Forename = $ objWorksheet.Cells.Item(2,1).Text
$ Surname = $ objWorksheet.Cells.Item(2,2).Text
写主机“名字:”$ Forename
写主机“姓:”$姓
$ objExcel.Quit()
如果(ps excel){kill -name excel}
我已经阅读了许多关于如何尝试解决美国问题的论坛和文章,但我似乎无法绕过它,希望有人在这里可以帮助!
这里是我提到的执行问题:
使用“6”参数调用“InvokeMember”的exception:“Method”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
工作表数量:
您无法在空值expression式上调用方法。
在C:\ PS \ excel.ps1:18 char:45
+ $ objWorksheet = $ objWorkbook.Worksheets.Item <<<<(1)
+ CategoryInfo:InvalidOperation:(Item:String)[],RuntimeException
+ FullyQualifiedErrorId:InvokeMethodOnNull
工作表:
您无法在空值expression式上调用方法。
在C:\ PS \ excel.ps1:21 char:37
+ $ Forename = $ objWorksheet.Cells.Item <<<<(2,1).Text
+ CategoryInfo:InvalidOperation:(Item:String)[],RuntimeException
+ FullyQualifiedErrorId:InvokeMethodOnNull
您无法在空值expression式上调用方法。
在C:\ PS \ excel.ps1:22 char:36
+ $姓氏= $ objWorksheet.Cells.Item <<<<(2,2).Text
+ CategoryInfo:InvalidOperation:(Item:String)[],RuntimeException
+ FullyQualifiedErrorId:InvokeMethodOnNull
用名字:
姓:
这是我曾经问过的第一个问题,试着做好! :))
非常感谢
马克斯
只是为了好玩,试着修改你的代码来运行一个没有名字空间的xls文件。 如果这样的话,那么你需要在这一行中转义文件名中的空格:
$objWorkbook = Invoke $objExcel.Workbooks.Open "C:\PS\User Data.xls"
或者可能引用这个参数:
$m.PSBase.GetType().InvokeMember( $method, [Reflection.BindingFlags]::InvokeMethod, $null, $m, $parameters,$ciUS )
我尝试修改代码,我有它的工作!
而不是使用
$objWorkbook = Invoke $objExcel.Workbooks.Open "C:\PS\User Data.xls"
我拿走了Workbooks.Open "C:\PS\User Data.xls" 。打开Workbooks.Open "C:\PS\User Data.xls"并创build了一个variables$file = "C:\PS\User Data.xls"
现在我用
$objWorkbook = Invoke $objExcel.Workbooks Open($File)
它几乎工作! 它现在不会对我造成任何错误,这是cmd的结果
Numer of worksheets: 3
Worksheet: List Of Names
Forename:
Surname:
但由于某种原因,它仍然不显示$ Forename或$姓氏
PS我也做了你所说的Massimo,并创build了一个堆栈溢出login,并在那里问了问题!
谢谢你们的帮助
尝试使用.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这已经修复了语言障碍问题,我现在可以运行脚本而不用担心调用function,一切都很好!
非常感谢
马克斯