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
- |--C:\Test\YY\
$的检查。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.txtTest 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的优秀文章()和“获取有关语法分析的帮助”