2009-11-25 17 views
5

Estoy intentando escribir una secuencia de comandos en PowerShell para convertir archivos de video por lotes.Comportamiento de la ruta de prueba en Powershell

La manera en que intento usarlo es ir a una carpeta llena de archivos de video y ejecutarla. Utiliza un programa de conversión que se puede ejecutar en el "modo de línea de comando" (llamado freno de mano) y guarda los archivos convertidos con "-android" adjunto a ellos antes de la extensión del archivo. Por ejemplo, si tengo un archivo llamado video1.avi en la carpeta, después de ejecutar el script, la carpeta tiene 2 archivos: video1.avi y video1-android.avi

La razón por la que quiero hacer esto de esta manera es que puedo verificar si, para cada archivo de video, hay una versión convertida de este (con -android adjunto al nombre). Y si es así, omita la conversión para ese archivo.

Y aquí es donde estoy teniendo problemas. El problema es el comportamiento de la ruta de prueba (el cmdlet que estoy usando para probar si existe un archivo).

Lo que sucede es que si el archivo de video tiene un nombre "inusual" (por ejemplo en mi caso es video [largo] .avi) Test-Path siempre devuelve False si intentas verificar si ese archivo existe.

Una manera fácil para que usted pueda probar esto es, por ejemplo, para hacer esto:

Ir a una carpeta vacía, plazo bloc de notas para crear un archivo con "[" en su nombre:

&notepad test[x].txt 

Guarde el archivo

continuación, haga lo siguiente:

Get-ChildItem | ForEach-Object {Test-Path $_.FullName} 

lo hace no es verdad! Debería? Bueno, no si el archivo tiene "[" en su nombre (no revisé ningún otro carácter especial)

Me he dado cuenta de que si escapas el "[" y "]" funciona

Test-Path 'test`[x`].txt' 

devuelve true.

¿Cómo puedo solucionar este problema? Quiero poder: dado un Nombre Base de un archivo, añádalo "-android.avi" y verifique si existe un archivo con ese nombre.

Gracias, Rui

Respuesta

8

Muchos cmdlets de PowerShell tienen parámetros de ruta que soportan los comodines. Como ha observado, en PowerShell no solo es * un comodín sino [ y ] también se consideran caracteres comodín. Puede leer más sobre esto en el tema de ayuda about_Wildcards.

Para su problema, si no necesita wildcarding entonces recomendaría usar el parámetro -LiteralPath. Este parámetro no admite comodines y acepta [ y ] caracteres literales trayectoria como por ejemplo:

Get-ChildItem | ForEach {Test-Path -LiteralPath ` 
         "$([io.path]::ChangeExtension($_.FullName,'avi'))"} 

FYI, la razón por la tubería de la salida de Get-ChildItem directamente en Test-Path funciona es porque el parámetro LiteralPath tiene un alias "PSPath" que se asigna a la propiedad PSPath en el objeto de FileInfo generado por Get-ChildItem.Esa propiedad se une al parámetro LiteralPath (er PSPath) "por nombre de propiedad".

+0

Gracias, eso era exactamente lo que necesitaba – Rui

1
dir | % {test-path "$($_.Name)-android.avi"} 
+1

¿Se puede elaborar en eso, ¿por qué los $ ($ _. Name) y el "% {}"? – Rui

+1

'%' y 'foreach' son alias para el cmdlet Forech a objetos. Dentro de una cadena, que puede hacer la expansión de variables simples como tan ' "$ _"' pero si se desea evaluar una expresión como acceso a una propiedad de un objeto, es necesario utilizar una subexpresión por ejemplo, '" $ ($ _. Nombre) "'. –

Cuestiones relacionadas