Pregunta

Estoy intentando comprobar una serie de directorios y subdirectorios para ver si hay dos o más archivos con el mismo nombre en la misma carpeta.Creo que mi problema es cómo intento validar una cadena.

Para el siguiente directorio de prueba:

  • |-- C:\Prueba\
    • |--C:\Prueba\AA\
      • |--C:\Prueba\YY\xx.log
      • |--C:\Prueba\YY\xx.txt
    • |-- C:\Prueba\ZZ\
    • |-- C:\Prueba\ZZ.log
    • |-- C:\Prueba\ZZ.txt

Necesito mi código para encontrar xx.log y ZZ.log.Puedo incluir un cheque contra $_.PSisContainer (pero no pensé que fuera necesario).

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" proporciona la cadena correcta pero no puedo usar esa cadena para validar la existencia del archivo.

¿Alguien puede ayudarme a corregir mi código?Me gustaría aprender a manejar cadenas concatenadas como esta; creo que es un truco que sería útil en otras áreas.

¿Fue útil?

Solución

Esto no se pretende como respuesta, más bien un comentario, pero por lo que no me permite agregar comentarios en este momento: (

r_c_iii - Supongo que hay dos errores en el código original.

En primer lugar, no crea la ruta completa del archivo (es decir, el directorio del directorio + Basename + .txt). En lugar de concatenar cadenas para hacer esto, Keith ha usado la capacidad de PowerShell para realizar sustituciones de valor dentro de las cadenas de doble cotización. e.g.

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

Resultados en

hello there

Para insertar las propiedades de objetos en una cadena de esta manera, es necesario usar las subpresiones como explica Keith.

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

Resultados en

c:\somefile.NEW

En segundo lugar (según mi comentario en la respuesta de Keith), el código original no verifica la existencia de la versión '.txt' del archivo. La segunda cláusula en la declaración de IF intenta equiparar el nombre de archivo modificado con $ verdadero ($ item.Basename + ". TXT" -EQ $ True). Esta cláusula siempre evaluará como falsa.

La modificación de Keith agrega el cmdlet 'Test-ruta de prueba' que, en este caso, verifica la existencia del archivo '.txt'.

Otros consejos

Prueba esto:

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

No necesitas la inicial Foreach declaración como comandos de PowerShell que los datos de salida se pueden usar directamente al inicio de una canalización.Luego filtra los objetos de la tubería con el Where dominio.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top