2013-04-30 10 views
-1

제 스크립트를 작동 시키려고하는데 여기 도움이 필요합니다.powershell 스크립트에서 오류를 찾는 데 도움이 필요합니다.

#excel 
#open ap 
$XL = new-object -com "Excel.Application" 
$XLbooks = $XL.workbooks 
$netci = [system.Globalization.CompareInfo]"en-us" 
$wkbk = $XLbooks.PSBase.GetType().Invokemember("Add",[Reflection.BindingFlags]::InvokeMethod,$null,$XLbooks,$null,$newci) 
$sheet = $XLbooks.worksheets.item(1) 
$sheet.name = "name" 
$sheet.cells.item($row,1).formulalocal = "Fred Nurk" 
$file = "c\windows\scripts\test.xlsx" 
[void]$wkbk.PSBase.GetType().InvokeMember("SaveAs",[Reflection.BindingFlags]::InvokeMethod,$null,$wkbk,$file,$newci) 
("Close",[Reflection.BindingFlags]::Invokemedthod,$null,$wkbk,0,$newci) 
$XL.quit() 

오류 :

Cannot convert the "en-us" value of type "System.String" to type "System.Globalization.CompareInfo". 
At C:\scripts\test.ps1:5 char:44 
+ $netci = [system.Globalization.CompareInfo] <<<< "en-us" 
    + CategoryInfo   : NotSpecified: (:) [], RuntimeException 
    + FullyQualifiedErrorId : RuntimeException 

You cannot call a method on a null-valued expression. 
At C:\scripts\test.ps1:7 char:34 
+ $sheet = $XLbooks.worksheets.item <<<< (1) 
    + CategoryInfo   : InvalidOperation: (item:String) [], RuntimeException 
    + FullyQualifiedErrorId : InvokeMethodOnNull 

Property 'name' cannot be found on this object; make sure it exists and is settable. 
At C:\scripts\test.ps1:8 char:8 
+ $sheet. <<<< name = "name" 
    + CategoryInfo   : InvalidOperation: (name:String) [], RuntimeException 
    + FullyQualifiedErrorId : PropertyNotFound 

You cannot call a method on a null-valued expression. 
At C:\scripts\test.ps1:9 char:18 
+ $sheet.cells.item <<<< ($row,1).formulalocal = "Fred Nurk" 
    + CategoryInfo   : InvalidOperation: (item:String) [], RuntimeException 
    + FullyQualifiedErrorId : InvokeMethodOnNull 

Exception calling "InvokeMember" with "6" argument(s): "Microsoft Excel cannot access the file 'C:\Users\Jared\Document 
s\c\windows\scripts\5ADD7000'. There are several possible reasons: 
The file name or path does not exist. 
The file is being used by another program. 
The workbook you are trying to save has the same name as a currently open workbook." 
At C:\scripts\test.ps1:11 char:42 
+ [void]$wkbk.PSBase.GetType().InvokeMember <<<< ("SaveAs",[Reflection.BindingFlags]::InvokeMethod,$null,$wkbk,$file,$n 
ewci) 
    + CategoryInfo   : NotSpecified: (:) [], MethodInvocationException 
    + FullyQualifiedErrorId : DotNetMethodTargetInvocation 
+0

무엇을해야할까요? – ash

+0

스프레드 시트와 데이터를 Excel에서 만듭니다. – mjared

+0

"작동하지 않는다"는 다소 모호합니다. 디버거를 사용해 보셨습니까? 무슨 일이야? – ash

답변

4

당신이 CompareInfo를 창조하고 해결해야 할 주요 문제를 해결합니다.

$netci = [system.Globalization.CompareInfo]"en-us" 

그래서 당신이해야 할 것입니다 무엇 CompareInfo 개체를 이런 식으로 만드는 것입니다 :

$netci = ([system.Globalization.CultureInfo]"en-us").CompareInfo 

을 비록 대신이 미친 방식을 사용하여 첫 번째 오류는이 라인이 작동하지 않는 알려줍니다 D

$wkbk = $XL.workbooks.Add() 
:

$wkbk = $XLbooks.PSBase.GetType().Invokemember("Add",[Reflection.BindingFlags]::InvokeMethod,$null,$XLbooks,$null,$newci) 

이 ... 대신 더 온건 한 방법을 시도 : 통합 문서를 만들

이렇게하면 CompareInfo 개체를 만드는 것에 대해 걱정할 필요가 없습니다.

0

내게 튀어 나온 문제는 $netci = [system.Globalization.CompareInfo]"en-us"이 잘못된 구문입니다. 당신은 System.Globalization.CompareInfo 클래스에 어떤 메소드도 호출하지 않고, 단지 그 뒤에 문자열을 배치하는 것입니다. PowerShell은 문자 변환 연산자로 [System.Globalization.CompareInfo]을 해석하고 해당 데이터 형식이 없기 때문에 문자열 "en-us"을 System.Globalization.CompareInfo 데이터 형식으로 변환 할 수 없다는 불만을 표시합니다.

"en-us"에서 작동하는 메소드를 호출해야합니다. 당신은 MSDN에서 방법의 목록을 얻을 수 있습니다 :

http://msdn.microsoft.com/en-us/library/system.globalization.compareinfo.aspx

당신이 원하는 방법 GetCompareInfo이라고 가정 (나에게 가장 가능성이 보인다 - 그것은 CompareInfo 개체를 반환), 당신은 그 라인이 방법을 써서 :

$netci = [System.Globalization.CompareInfo]::GetCompareInfo('en-us') 

주, BTW, 당신이 $netci 등이 변수를 가지고 당신은 그것을 만들 수 있지만 때 스크립트의 나머지 $newci있다.

나는 다른 오류들에 너무 깊이 들여다 보지 않았지만 $ newci를 제대로 작성하지 못했을 때의 계단식 효과 일 수 있습니다. 따라서이 문제를 해결하면 다른 오류는 사라질 것입니다.

관련 문제