PowerShell中是否允许嵌套循环和if语句



我可以使用PowerShell中嵌套循环的一些帮助。我有一份有项目名称的文件。我有一个装满图片的文件夹。我正在循环浏览项目名称,并测试是否有该项目的图像。一个项目只会在文档中列出一次,但它可能有多个图像。例如,文档中的ItemXYZ在images文件夹中可能具有ItemXYZ、ItemXYZ_1和ItemXYZ_2。这段代码适用于我尝试做的事情:

for ($i=2; $i -le $rowCount; $i++) {
Write-Host -NoNewline ("Checking line $i of $rowCount`n")
$item = $worksheet.Cells.Item($i,1).Text  #Item(row,column)
foreach ($image in $images) {
if ($item -eq $image.BaseName) {
$worksheet.Cells.Item($i,21).Value = $hyperlinkchunk1 + $image.FullName + $hyperlinkchunk2 + $image.Name + $hyperlinkchunk3
Write-Host ("** MATCH **")
}
for ($x=1; $x -le 12; $x++) {
if ($item+'_'+$x -eq $image.BaseName) {
$z = $x+21
$worksheet.Cells.Item($i,$z).Value = $hyperlinkchunk1 + $image.FullName + $hyperlinkchunk2 + $image.Name + $hyperlinkchunk3
Write-Host ("** MATCH **")
}
}
}
}

项目的第一个图像将始终只是基本名称,因此如果第一个图像不存在,则无需检查12个下划线图像。因此,我想将嵌套的for语句放在第一个if语句中(更新了下面的代码块(。这就引出了这个问题。当我进行此调整时,我不会使用第一块代码找到所有匹配项。知道为什么吗?

for ($i=2; $i -le $rowCount; $i++) {
Write-Host -NoNewline ("Checking line $i of $rowCount`n")
$item = $worksheet.Cells.Item($i,1).Text  #Item(row,column)
foreach ($image in $images) {
if ($item -eq $image.BaseName) {
$worksheet.Cells.Item($i,21).Value = $hyperlinkchunk1 + $image.FullName + $hyperlinkchunk2 + $image.Name + $hyperlinkchunk3
Write-Host ("** MATCH **")

for ($x=1; $x -le 12; $x++) {
if ($item+'_'+$x -eq $image.BaseName) {
$z = $x+21
$worksheet.Cells.Item($i,$z).Value = $hyperlinkchunk1 + $image.FullName + $hyperlinkchunk2 + $image.Name + $hyperlinkchunk3
Write-Host ("** MATCH **")
}
}

}        
}
}

我在你的代码中没有看到任何东西会阻止它按照你期望的方式工作。Andrew Davis的评论可能是正确的,他说你的一些原始匹配来自循环,而不是If语句,你加载到脚本中的信息有点不对劲。我想先检查一下。

如果您仍然遇到问题,也许可以尝试在If语句中放入一个检查变量,并使用它来控制循环。

foreach ($image in $images) {

$match = $false
if ($item -eq $image.BaseName) {
$worksheet.Cells.Item($i, 21).Value = $hyperlinkchunk1 + $image.FullName + $hyperlinkchunk2 + $image.Name + $hyperlinkchunk3
Write-Host ("** MATCH **")

$match = $true
}

if ($match = $true) {
for ($x = 1; $x -le 12; $x++) {
if ($item + '_' + $x -eq $image.BaseName) {
$z = $x + 21
$worksheet.Cells.Item($i, $z).Value = $hyperlinkchunk1 + $image.FullName + $hyperlinkchunk2 + $image.Name + $hyperlinkchunk3
Write-Host ("** MATCH **")
}
}
}
}

显然,在第一个If语句中包含循环是可取的,但这个选项也可以。

最新更新