我有一段简单的代码如下:
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
。
谢谢!
答案 0 :(得分:3)
目前您正在返回$someFile.Name
,因此在S
发生时会提供R
文件,在下一次迭代中,它会转到T
(或者下一个是什么)而不是S
。当存在多个R文件等时,逻辑也会崩溃。
如果您只想跳过R
和S
个文件,可能只想使用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 }