Я в основном пытаюсь сравнить ячейку в Excel с другой ячейкой в другом листе с помощью PowerShell. Это код, который я использую:

# Define location
$crs = "C:\temp\CRSENGCY_PS.xlsx"
$english = "English"
$welsh = "Welsh"
$SubSection = "SubSection"

# Create instance
$objExcel = New-Object -ComObject Excel.Application 
$workBook = $objExcel.Workbooks.Open($crs)
$englishSheet = $workBook.Worksheets.Item($english)
$subSectionSheet = $workBook.Worksheets.Item($SubSection)
$objExcel.Visible = $false

# Num of rows
$engRowMax = 1812
$subRowMax = 677

# Define columns 
$rowName, $colName = 1, 1

for ($i=1; $i -le $subRowMax; $i++) {
    $SubSectionName = $subSectionSheet.Cells.Item($rowName+$i,2).Text
    $3SubSections = $SubSectionName.Substring(0, 3)

    for ($i=1; $i -le $engRowMax; $i++) {
        $englishName = $englishSheet.Cells.Item($rowName+$i, $colName).Text
        $3englishName = $englishName.Substring(0, 3)

        if ($3englishName -eq $3SubSections) {
            Write-Host("Success")
        } else {
            Write-Host("Failed" + $3SubSections + " " + $3englishName)
        }
    }
}

$objExcel.Quit()

У меня проблема в том, что цикл for внизу выполняется только один раз. Цикл for внутри выполняется правильное количество раз. Если я удалю вложенный цикл for, он будет работать нормально.

0
bsod_ 13 Мар 2018 в 00:04

2 ответа

Лучший ответ

Если кому-то интересно, вот мой рабочий сценарий -

# Define location

$crs = "C:\temp\CRSENGCY_PS.xlsx"
$english = "English"
$welsh = "Welsh"
$SubSection = "SubSection"

# Create instance

$objExcel = New-Object -ComObject Excel.Application 
$workBook = $objExcel.Workbooks.Open($crs)
$englishSheet = $workBook.Worksheets.Item($english)
$welshSheet = $workBook.Worksheets.Item($welsh)
$subSectionSheet = $workBook.Worksheets.Item($SubSection)
$objExcel.Visible=$false

# Num of rows

$engRowMax = 1812
$subRowMax = 677

# Define columns 

$rowName,$colName = 2,1

# Vars

$engSubID = $englishSheet.Cells.Item($rowName+$s,8)
$welSubID = $welshSheet.Cells.Item($rowName+$s,8)


for ($i=0; $i -le 339; $i++)
{
    $SubSectionName = $subSectionSheet.Cells.Item($rowName+$i,2).text
    $SubSecID = $subSectionSheet.Cells.Item($rowName+$i,1).text
    #$3SubSections = $SubSectionName.Substring(0,3)
    $SubSecRef = $SubSectionName.Substring(0, $SubSectionName.IndexOf(' ')) 
    #Write-Host($SubSecRef)

        for ($s=1; $s -le 1811; $s++)
        {
            $englishName = $englishSheet.Cells.Item($rowName+$s,$colName).text
            #$3englishName = $englishName.Substring(0,$englishName.)
            $refno = $englishName.Substring(0, $englishName.IndexOf('.') + 1 + $englishName.Substring($englishName.IndexOf('.') + 1).IndexOf('.'))

            if ($SubSecRef -eq $refno)
            {
                $englishSheet.Cells.Item($rowName+$s,8) = $SubSecID
                Write-host("Match!!")
            }
            else 
            {
                #Write-host("No Match " + $3SubSections + " " + $3englishName)
            }

        }
        Write-Host($i)
}

$workBook.Save()
$workBook.Close()
$objExcel.Quit() 
0
bsod_ 19 Мар 2018 в 13:33

Я считаю, что ваша проблема в том, что вложенный цикл For не заканчивается. Вы, вероятно, захотите поместить оператор Break в оба цикла For, чтобы сообщить им, в какой момент вы хотите, чтобы они вышли из циклов.

Следующие ссылки могут помочь подробнее объяснить оператор Break :

Циклы PowerShell: основы перерыва

Вложенный ForEach () в PowerShell

0
Dylan Hurst 12 Мар 2018 в 21:37