Можно ли читать Excel через PowerShell, как это? - PullRequest
1 голос
/ 29 февраля 2020

У меня есть этот Excel

enter image description here

каждая строка - это скрипт автоматизации, который мне нужно выполнить с определенными параметрами, Excel - потому что каждый скрипт получает разные параметры, и мне нужно сделать сценарий powershell, который читает файл Excel и для каждой строки, выполнить этот идентификатор процесса (скрипт) и отправить эти параметры

есть ли способ сделать это? это выполнимо?

пока у меня есть это

$file = "C:\Users\MX02689\Documents\Parametros.xlsx"
$sheetName = "Sheet1"
$objExcel = New-Object -ComObject Excel.Application
$workbook = $objExcel.Workbooks.Open($file)
$sheet = $workbook.Worksheets.Item($sheetName)
$objExcel.Visible=$false
$rowMax = ($sheet.UsedRange.Rows).count

$colMax = ($sheet.UsedRange.Columns).count

$rowName,$colName = 1,1
#the idea here is that for each row that has values do this
for($i=1;$i-le $colMax-1; $i++)

#The idea here is that if (parameter 1 -eq 1 ){
execute the command we use to send the scripts process id; "parameter2 parameter 3 parameter 4" 
}else{
skip the row and go to the next one
}
{
Write-Output("" + $sheet.Cells.Item($rowName,$colName+$i).text)

}

Я в правильном направлении? спасибо за помощь:)

я в правильном направлении? выполнимо ли то, что я пытаюсь сделать? Есть ли оптимизированный способ добиться этого? спасибо за помощь :) Привет

1 Ответ

0 голосов
/ 29 февраля 2020

Использование Excel - не самый быстрый или простой способ сделать это с PowerShell.
Это можно сделать так:

$file = "D:\Parametros.xlsx"
$objExcel = New-Object -ComObject Excel.Application
$workbook = $objExcel.Workbooks.Open($file)
$sheet = $workbook.Worksheets.Item(1)
$objExcel.Visible = $false
$rowMax = ($sheet.UsedRange.Rows).count
$colMax = ($sheet.UsedRange.Columns).count

for ($row = 2; $row -le $rowMax; $row++) {   # skip the header row
    $params = @()
    for ($col = 1; $col -le $colMax; $col++) {
        $params += $sheet.Cells.Item($row, $col).Value()
    }
    # execute the command. For demo, just show the parameters used
    'Invoke-Command parameters: {0}' -f ($params -join ', ')
}

$objExcel.Quit()
# clean-up used Com objects
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($sheet)    | Out-Null
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($workbook) | Out-Null
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($objExcel) | Out-Null
[System.GC]::Collect()
[System.GC]::WaitForPendingFinalizers()

Гораздо удобнее было бы сохранить файл Excel в формате CSV и используйте это:

Import-Csv -Path 'D:\Parametros.csv' | ForEach-Object {
    # execute the command. For demo, just show the parameters used
    'Invoke-Command parameters: {0}, {1}, {2}, {3}' -f $_.'process id', $_.parameter1, $_.parameter2, $_.parameter3, $_.parameter4
}

Демонстрационный вывод для обоих методов:

Invoke-Command parameters: 235522, 1, testinguser3, Mko12345, something
Invoke-Command parameters: 235266, 0, testinguser4, Mko12346, something
Invoke-Command parameters: 235266, 1, testinguser5, Mko12347, something

Из вашего комментария я теперь понимаю, что такое "1" или " 0 "означает в параметре 1. Ниже приведены скорректированные коды для Excel, а также метод CSV:

Метод для Excel:

$file = "D:\Parametros.xlsx"
$objExcel = New-Object -ComObject Excel.Application
$workbook = $objExcel.Workbooks.Open($file)
$sheet = $workbook.Worksheets.Item(1)
$objExcel.Visible = $false
$rowMax = ($sheet.UsedRange.Rows).count
$colMax = ($sheet.UsedRange.Columns).count

for ($row = 2; $row -le $rowMax; $row++) {   # skip the header row
    $params = @()
    for ($col = 1; $col -le $colMax; $col++) {
        $params += $sheet.Cells.Item($row, $col).Value()
    }
    # if the second parameter value converted to int = 1, proceed; if 0 skip the line
    if ([int]$param[1] -ne 0) {
        # execute the command. For demo, just show the parameters used
        'Invoke-Command parameters: {0}' -f ($params -join ', ').TrimEnd(", ")
    }
}

$objExcel.Quit()
# clean-up used Com objects
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($sheet)    | Out-Null
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($workbook) | Out-Null
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($objExcel) | Out-Null
[System.GC]::Collect()
[System.GC]::WaitForPendingFinalizers()

Метод для файла CSV:

Import-Csv -Path 'D:\Parametros.csv' | ForEach-Object {
    # get the field values from the row in array $params (not a fixed number of fields)
    $params = @($_.PsObject.Properties).Value

    # if the second parameter value converted to int = 1, proceed; if 0 skip the line
    if ([int]$params[1] -ne 0) {
        # execute the command. For demo, just show the parameters used
        'Invoke-Command parameters: {0}' -f ($params -join ', ').TrimEnd(", ")
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...