Como ler dados da célula no excel e enviar para o prompt de comando [closed]

1

Sou um administrador de sistemas e estou tentando aprender como usar o powershell ... Eu nunca fiz nenhum tipo de script ou codificação antes e tenho aprendido online aprendendo no centro de script technet e fóruns on-line. .

O que estou tentando fazer é abrir uma planilha do Excel para obter informações dela (nomes de usuário e senha) e, em seguida, enviá-la para o prompt de comando no PowerShell. Quando eu tento fazer isso, recebo uma Exceção chamando "InvokeMember", aqui está o código que eu tenho até agora:

 
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 "Numer of worksheets: " $objWorkbook.Sheets.Count

$objWorksheet = $objWorkbook.Worksheets.Item(1) Write-Host "Worksheet: " $objWorksheet.Name

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

Write-Host "Forename: " $Forename Write-Host "Surname: " $Surname

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

Eu tenho lido muitos posts diferentes em fóruns e artigos sobre como tentar contornar o problema en-US, mas eu não consigo contornar isso e espero que alguém aqui possa ajudar!

Aqui está o problema de Exeption que mencionei:

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

Numer of worksheets: You cannot call a method on a null-valued expression. At C:\PS\excel.ps1:18 char:45 + $objWorksheet = $objWorkbook.Worksheets.Item <<<< (1) + CategoryInfo : InvalidOperation: (Item:String) [], RuntimeException + FullyQualifiedErrorId : InvokeMethodOnNull

Worksheet: You cannot call a method on a null-valued expression. At C:\PS\excel.ps1:21 char:37 + $Forename = $objWorksheet.Cells.Item <<<< (2,1).Text + CategoryInfo : InvalidOperation: (Item:String) [], RuntimeException + FullyQualifiedErrorId : InvokeMethodOnNull

You cannot call a method on a null-valued expression. At C:\PS\excel.ps1:22 char:36 + $Surname = $objWorksheet.Cells.Item <<<< (2,2).Text + CategoryInfo : InvalidOperation: (Item:String) [], RuntimeException + FullyQualifiedErrorId : InvokeMethodOnNull

Forename: Surname:

Esta é a primeira pergunta que eu fiz, tente ser legal! :))

Muitos agradecimentos

Máximo

    
por Max Ollerenshaw 03.09.2009 / 21:15

4 respostas

1

Apenas por diversão, tente modificar seu código para ser executado em um arquivo xls que não tenha um espaço em seu nome. Se isso funcionar, então você precisa escapar do espaço no nome do arquivo nesta linha:

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

ou talvez cite o parâmetro neste:

$m.PSBase.GetType().InvokeMember(
$method, [Reflection.BindingFlags]::InvokeMethod, $null, $m, $parameters,$ciUS )
    
por 04.09.2009 / 00:46
1

Eu tentei modificar o código e consegui trabalhar assim!

Em vez de usar

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

Eu tirei o Workbooks.Open "C:\PS\User Data.xls" e criei uma variável $file = "C:\PS\User Data.xls"

Agora eu uso

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

E quase funciona! Agora não lança nenhum erro para mim e aqui está o resultado em cmd

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

Mas, por alguma razão, ele ainda não exibe o $ Forename ou $ Surname

P.S Eu também fiz como você disse Massimo e criei um login no estouro de pilha e fiz a pergunta lá!

Obrigado pela sua ajuda pessoal

    
por 04.09.2009 / 14:36
1

Tente usar .Value2 em vez de texto. Aqui está um exemplo simples de como abrir uma pasta de trabalho do Excel e ler um valor:

$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
    
por 04.09.2009 / 17:11
1

obrigado pela sua ajuda ... Eu consertei o problema! Eu estava usando o PowerShell V2 CTP2, agora eu atualizei para CTP3 isso corrigiu o problema de barreira do idioma e agora posso executar scripts sem se preocupar com a função invocar e está tudo bem!

Muitos agradecimentos

Máximo

    
por 10.09.2009 / 13:45