Powershell - Descobrir se existem dois arquivos com o mesmo nome
-
21-12-2019 - |
Pergunta
Estou tentando verificar uma série de diretórios e sub-diretórios para ver se há dois ou mais arquivos com o mesmo nome na mesma pasta.Eu acho que o meu problema é que eu estou tentando validar uma seqüência de caracteres.
Para o teste seguinte diretório:
- |-- C: est\
- |--C: est\YY\
- |--C: est\YY\xx.log
- |--C: est\YY\xx.txt
- |-- C: est\ZZ\
- |-- C: est\ZZ.log
- |-- C: est\ZZ.txt
- |--C: est\YY\
Eu preciso do meu código para localizar xx.registo e ZZ.o registo.Posso incluir uma verificação contra $_.PSisContainer
(mas eu não acho que foi necessário).
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"
fornece a cadeia para a direita, mas eu não posso usar essa seqüência de caracteres para validar a existência do arquivo.
Alguém pode me ajudar a corrigir o meu código?Eu gostaria de saber como lidar com seqüências de caracteres concatenada como este-é um truque que eu acho que poderia ser útil em outras áreas.
Solução
Esta não pretende ser uma resposta, ao invés de um comentário, mas ISSO não é o que me permite adicionar comentários agora :(
R_C_III - eu acho que há dois erros no código original.
Em primeiro lugar, ele não constrói o caminho completo do arquivo (por exemplo,DirectoryName + Nome + .TXT).Ao invés de concatenar cadeias de caracteres para fazer isso, Keith usou PowerShell capacidade para efectuar valor substituições entre duas seqüências de caracteres entre aspas.exemplo:
$s = "there"
write-host "hello $s"
resultados
hello there
Para inserir propriedades do objeto em uma seqüência de caracteres desta forma é necessário o uso de sub-expressões como Keith explica.
$file = get-item "c:\somefile.txt"
write-host "$($file.DirectoryName)\$($file.BaseName).NEW"
resultados
c:\somefile.NEW
Em segundo lugar (como por o meu comentário sobre Keith resposta), o código original não verificar a existência de '.txt' versão do arquivo.A cláusula segunda no CASO de declaração de tentativas de equacionar a modificação de nome de arquivo com $True ($item.basename+".txt" -eq $True).Esta cláusula será sempre avaliada como false.
Keith modificação adiciona o 'Test-Path' CmdLet que, neste exemplo, verifica a existência da '.txt' arquivo.
Outras dicas
Tente isso:
gci C:\Test -recurse -file | Where {$_.extension -ne ".txt" -AND (Test-Path "$($_.DirectoryName)\$($_.BaseName).txt")}
Você não precisa inicial Foreach
declaração PowerShell comandos de saída de dados pode ser usado diretamente no início de um pipeline.Em seguida, você filtro de objetos de pipeline com o Where
de comando.