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

对于以下测试目录:

  • |--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脧脗脭脴

我需要我的代码来查找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 命令。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top