2012-04-13 10 views
8

Sto provando a convalidare l'esistenza di un file ma il problema è che il nome del file ha parentesi nel nome es: c: \ test [R] 10005404, Failed con commenti, [S] SiteName.txt.

Ho provato a utilizzare il metodo stringa .replace senza esito.

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

provato

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

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

idee sarebbe molto apprezzato. Grazie, il crisma

+0

Ci dovrebbe essere virgolette il nome del percorso: '$ a = 'c: \ test \ [R] 10.005.404, non riuscito con Commenti, [S] SiteName.txt''. È solo un refuso o è nel tuo codice? – Rynant

+0

Un vecchio Windows [Suggerimento PowerShell della settimana] (http://technet.microsoft.com/en-us/library/ff730956.aspx) spiegava perché e soluzioni alternative. Questo è un tipo di domanda duplicata da [powershell get-childitem non può gestire il nome del file che inizia con [carattere anche con carattere escape] (http://stackoverflow.com/a/9508802/608772) – JPBlanc

risposta

21

Provare a utilizzare il parametro -LiteralPath:

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

parentesi quadre hanno un significato speciale.

In realtà è una funzione POSIX in modo da poter fare questo:

dir [a-f]* 

Questo vi darà tutte le cose in directory corrente che iniziano con la lettera A a F. Bash ha la stessa funzione.

5

Ci sono almeno tre modi per farlo funzionare.

Utilizzando qualcosa di simile al proprio approccio, è necessario aggiungere 2 apici inversi quando si usano virgolette doppie poiché un singolo apice sarà valutato come carattere di escape prima di essere inviato al metodo Replace.

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

Uso apici nel metodo Replace eviterà anche backticks vengano rimosse.

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

Infine, è possibile utilizzare il parametro LiteralPath che non utilizza i caratteri jolly (le parentesi quadre sono utilizzati da PowerShell partite per definire una serie di caratteri che può essere abbinato).

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

+1 I primi due sono soluzioni ideali quando è necessario usare i caratteri jolly come '* .txt' accanto a file o cartelle con' ['o'] 'nei loro nomi – user66001

Problemi correlati