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

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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top