2012-04-13 9 views
8

Estoy tratando de validar la existencia de un archivo pero el problema es que el nombre del archivo tiene corchetes en el nombre, es decir c: \ test [R] 10005404, Fallido con Comentarios, [S] SiteName.txt.

He intentado utilizar el método .replace de cadena sin éxito.

$a = c:\test\[R] 10005404, Failed with Comments, [S] SiteName.txt 
$Result = (Test-Path $a) 
# Returns $False even though the file exists. 

Probamos

$a = $a.Replace("[", "`[") 
$a = $a.Replace("]", "`]") 

$Result = (Test-Path $a) 
# Also returns $False even though the file exists. 

Ideas sería muy apreciada. Gracias , Crismal

+0

Debería haber comillas alrededor del nombre de ruta: '$ a = 'c: \ test \ [R] 10005404, Falló con Comentarios, [S] SiteName.txt''. ¿Es solo un error tipográfico o está en tu código? – Rynant

+0

Un antiguo [Sugerencia de la semana de PowerShell] (http://technet.microsoft.com/en-us/library/ff730956.aspx) explicó por qué y las soluciones. Este es un tipo de pregunta duplicada de [powershell get-childitem no puede manejar el nombre de archivo comenzando con [carácter incluso con carácter de escape] (http://stackoverflow.com/a/9508802/608772) – JPBlanc

Respuesta

21

Trate de usar el parámetro -LiteralPath:

Test-Path -LiteralPath 'C:\[My Folder]' 

corchetes tienen un significado especial.

En realidad es una característica POSIX para que pueda hacer esto:

dir [a-f]* 

Esto le dará todas las cosas en el directorio actual que comienzan con la letra A a la F. Bash tiene la misma función.

5

Hay al menos tres formas de hacerlo funcionar.

Usando algo similar a su enfoque, necesita agregar 2 puntos de apoyo cuando usa comillas dobles, ya que un solo backtick se evaluará como un carácter de escape antes de enviarse al método Replace.

$a = "c:\test\[R] 10005404, Failed with Comments, [S] SiteName.txt" 
$a = $a.Replace("[", "``[") 
$a = $a.Replace("]", "``]") 
$Result = Test-Path $a 

Uso de comillas simples en el método Replace también evitará los acentos abiertos de ser eliminado.

$a = "c:\test\[R] 10005404, Failed with Comments, [S] SiteName.txt" 
$a = $a.Replace('[', '`[') 
$a = $a.Replace(']', '`]') 
$Result = Test-Path $a 

Por último, se puede utilizar el parámetro LiteralPath que no utiliza comodines (los corchetes son utilizados por PowerShell partidos para definir un conjunto de caracteres que pueden ser igualada).

$a = "c:\test\[R] 10005404, Failed with Comments, [S] SiteName.txt" 
$Result = Test-Path -LiteralPath $a 
+0

+1 Los primeros dos son soluciones ideales cuando se necesitan para usar comodines como '* .txt' junto a archivos o carpetas con' ['o'] 'en sus nombres – user66001

Cuestiones relacionadas