Powershell-找出是否有两个文件具有相同的名称
-
21-12-2019 - |
题
我正在尝试检查一系列目录和子目录,以查看同一文件夹中是否有两个或多个同名文件。我想我的问题是我如何尝试验证字符串。
对于以下测试目录:
- |--C: est\
- |--C: est\YY\
- |--C: est\YY\xx.log
- |--C: est\YY\xx.txt
- |--C: est\ZZ\
- |--C: est\ZZ...日志
- |--C: est\ZZ...txt脧脗脭脴
- |--C: est\YY\
我需要我的代码来查找xx.log和ZZ。日志。我可以包括一张支票 $_.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"
提供了正确的字符串,但我无法使用该字符串来验证文件的存在。
任何人都可以帮助更正我的代码吗?我想学习如何处理像这样的串联字符串-这是我认为在其他领域有用的技巧。
解决方案
这不是一个答案,而是一个评论,但现在不允许我添加评论:(
R_C_III-我猜原始代码中有两个错误。
首先,它不会构建完整的文件路径(即DirectoryName+BaseName+。TXT)。Keith没有串联字符串来做到这一点,而是使用PowerShell在双引号字符串中执行值替换的能力。例如
$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
其次(根据我对Keith答案的评论),原始代码不会检查'的存在。txt'版本的文件。IF语句中的第二个子句试图将修改后的文件名等同于True True(item item。basename+"。txt"-eq$True)。此条款将始终评估为false。
Keith的修改增加了"Test-Path"CmdLet,在这种情况下,它检查"的存在。txt'文件。
其他提示
试试这个:
gci C:\Test -recurse -file | Where {$_.extension -ne ".txt" -AND (Test-Path "$($_.DirectoryName)\$($_.BaseName).txt")}
你不需要初始 Foreach
作为PowerShell命令的语句,输出数据可以直接在管道的开始处使用。然后,您可以使用 Where
命令。
不隶属于 StackOverflow