Powershell - 查明是否有两个具有相同名称的文件

时间:2014-07-29 18:02:27

标签: powershell get-childitem file-comparison

我试图检查一系列目录和子目录,以查看同一文件夹中是否有两个或多个具有相同名称的文件。我认为我的问题是我如何尝试验证字符串。

对于以下测试目录:

  • | - C:\ Test \
    • | --C:\测试\ YY \
      • | --C:\测试\ YY \ xx.log
      • | --C:\测试\ YY \ xx.txt
    • | - C:\ Test \ ZZ \
    • | - C:\ Test \ ZZ.log
    • | - C:\ Test \ ZZ.txt

我需要我的代码才能找到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"提供了正确的字符串,但我无法使用该字符串来验证文件是否存在。

任何人都可以帮忙更正我的代码吗?我想学习如何处理这样的连接字符串 - 这是我认为在其他方面有用的技巧。

2 个答案:

答案 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'是否存在。文件。