0

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

对于以下测试目录:

  • |-- C:\测试\
    • |--C:\测试\YY\
      • |--C:\Test\YY\xx.log
      • |--C:\Test\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"提供了正确的字符串,但我不能使用该字符串来验证文件的存在。

任何人都可以帮助纠正我的代码吗?我想学习如何处理这样的连接字符串——我认为这是一个在其他领域有用的技巧。

4

2 回答 2

1

尝试这个:

gci C:\Test -recurse -file | Where {$_.extension -ne ".txt" -AND (Test-Path "$($_.DirectoryName)\$($_.BaseName).txt")}

您不需要初始Foreach语句,因为可以在管道开始处直接使用输出数据的 PowerShell 命令。然后使用Where命令过滤管道对象。

于 2014-07-29T18:31:20.863 回答
1

这不是一个答案,而是一个评论,但是现在不允许我添加评论:(

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

其次(根据我对基思回答的评论),原始代码不检查文件的“.txt”版本是否存在。IF 语句中的第二个子句尝试将修改后的文件名等同于 $True ($item.basename+".txt" -eq $True)。该子句将始终评估为假。

Keith 的修改添加了“Test-Path”CmdLet,在这种情况下,它检查“.txt”文件是否存在。

于 2014-07-30T03:58:10.630 回答