MoveNext无法使用-or的一部分

时间:2011-11-29 15:51:08

标签: powershell

我有一段简单的代码如下:

foreach ($someFile in Get-ChildItem) {
    if (($someFile.Name.Substring(0,1) -eq "R") -or ($someFile.Name.Substring(0,1) -eq "S") {
        $foreach.MoveNext() | Out-Null
        $someFile.Name
    }
}

这个简单示例的想法是为那些以字母“R”或“S”开头的文件输出之外的所有文件名。

当我在一个目录中运行它时,一个文件以“R”开头,一个以“S”开头,还有一些其他文件,它会跳过“S”文件,但是“R”文件名仍然会显示出来。

我知道还有其他方法可以实现这一目标,但这是为了确保我在使用foreach之前正确使用它,然后再使用更复杂的代码。

任何人都可以看到上面的代码有问题吗?它似乎应该对我有用。我还确认$someFile.Name.Substring(0,1) -eq "R"按预期为“R”文件返回True

谢谢!

2 个答案:

答案 0 :(得分:3)

目前您正在返回$someFile.Name,因此在S发生时会提供R文件,在下一次迭代中,它会转到T(或者下一个是什么)而不是S。当存在多个R文件等时,逻辑也会崩溃。

如果您只想跳过RS个文件,可能只想使用continue

foreach ($someFile in Get-ChildItem)
{
    if (($someFile.Name.Substring(0,1) -eq "R") -or ($someFile.Name.Substring(0,1) -eq "S"))
    {
        continue

    }
    $foreach.Current.Name  # $somefile.Name
}

此外,您可以使用String.StartsWith而不是SubString。或者使用-like并将其合并为一张支票。

答案 1 :(得分:0)

foreach ($someFile in Get-ChildItem) {
    if ($someFile.Name -notlike '[RS]*') {
        $someFile.Name
    }
}

Get-ChildItem -Exclude '[RS]*' | %{ $_.Name }