Powershell-查看是否有两个同名文件

Powershell-查看是否有两个同名文件,powershell,get-childitem,file-comparison,Powershell,Get Childitem,File Comparison,我试图检查一系列目录和子目录,以查看同一文件夹中是否有两个或多个同名文件。我想我的问题是如何验证字符串 对于以下测试目录: |--C:\测试\ |--C:\Test\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(但我认为没有必要) $

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

对于以下测试目录:

  • |--C:\测试\
    • |--C:\Test\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
(但我认为没有必要)

$item.basename+“.txt”
提供了正确的字符串,但我无法使用该字符串验证文件是否存在

有人能帮我更正代码吗?我想学习如何处理像这样的连接字符串——我认为这是一个在其他领域很有用的技巧。

试试这个:

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

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

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

我想原始代码中有两个错误

首先,它没有构建完整的文件路径(即DirectoryName+BaseName+.TXT)。Keith没有连接字符串来实现这一点,而是使用PowerShell的功能在双引号字符串中执行值替换

$s = "there"
write-host "hello $s"
导致

hello there
c:\somefile.NEW
要以这种方式将对象属性插入字符串,有必要使用子表达式,正如Keith所解释的那样

$file = get-item "c:\somefile.txt"
write-host "$($file.DirectoryName)\$($file.BaseName).NEW"
导致

hello there
c:\somefile.NEW
其次(根据我对Keith答案的评论),原始代码没有检查文件的“.txt”版本是否存在。IF语句中的第二个子句试图将修改后的文件名与$True($item.basename+“.txt”-eq$True)相等。该子句的计算结果始终为false


Keith的修改添加了“Test Path”CmdLet,在本例中,该CmdLet检查“.txt”文件的存在。

工作得很好!谢谢!您能解释一下“$($.DirectoryName)\$($.BaseName).txt”是如何工作的吗?$()如何做我的$.BaseName+”.txt没有?要计算字符串中的表达式(如属性引用),需要使用子表达式,即
$()
.R\u C_III-在我看来,原始表达式正在尝试将字符串($item.basename+“.txt”)与布尔($True)等同起来.Keith添加了Test Path CmdLet,用于检查文件是否存在。谢谢!回答得很好!我缩小了核心问题的范围:您能解释以下示例吗?
$item.basename+.txt“
生成一个ZZ.txt
Test Path$item.basename+.txt”的System.String
找不到接受参数“+.txt”和
写入主机$item.basename+.txt”的位置参数错误
生成ZZ+.txt
$($item.basename+.txt”)
生成一个系统。ZZ.txt字符串和write host从外部显示ZZ.txt这些应该是相同的,但write host显示不同。我认为这是我在OP中的问题。是否所有字符串都不相等?@andyb@keith Hillst强烈怀疑这与PowerShell解析模式有关。我建议您使用Keith的优秀文章()和“获取有关语法分析的帮助”