我试图检查一系列目录和子目录,以查看同一文件夹中是否有两个或多个具有相同名称的文件。我认为我的问题是我如何尝试验证字符串。
对于以下测试目录:
我需要我的代码才能找到xx.log和ZZ.log。我可以对$_.PSisContainer
进行检查(但我认为没有必要)。
ForEach ($item in (gci "C:\Test\*" -recurse)) {
If ($item.extension -notmatch "txt" -AND $item.basename+".txt" -eq $True) {
Write-Host $item.fullname
}
}
$item.basename+".txt"
提供了正确的字符串,但我无法使用该字符串来验证文件是否存在。
任何人都可以帮忙更正我的代码吗?我想学习如何处理这样的连接字符串 - 这是我认为在其他方面有用的技巧。
答案 0 :(得分:1)
试试这个:
gci C:\Test -recurse -file | Where {$_.extension -ne ".txt" -AND (Test-Path "$($_.DirectoryName)\$($_.BaseName).txt")}
您不需要初始Foreach
语句作为PowerShell命令,输出数据可以直接在管道的开头使用。然后使用Where
命令过滤管道对象。
答案 1 :(得分:1)
这不是一个答案,而是一个评论,但是现在不允许我添加评论:(
R_C_III - 我猜原始代码中有两个错误。
首先,它不构建完整的文件路径(即DirectoryName + BaseName + .TXT)。 Keith使用PowerShell的能力在双引号字符串中执行值替换,而不是连接字符串来执行此操作。 e.g。
$s = "there"
write-host "hello $s"
结果
hello there
要以这种方式将对象属性插入到字符串中,就像Keith所解释的那样,使用子表达式是必要的。
$file = get-item "c:\somefile.txt"
write-host "$($file.DirectoryName)\$($file.BaseName).NEW"
结果
c:\somefile.NEW
其次(根据我对基思答案的评论),原始代码不会检查' .txt'是否存在。该文件的版本。 IF语句中的第二个子句试图将修改后的文件名等同于$ True($ item.basename +" .txt" -eq $ True)。此子句将始终评估为false。
Keith的修改增加了“测试路径”和#39; CmdLet,在这种情况下,检查' .txt'是否存在。文件。