2012-04-13 8 views
8

Ich versuche, das Vorhandensein einer Datei zu validieren, aber das Problem ist, dass der Dateiname Klammern im Namen hat, zB c: \ test [R] 10005404, Failed mit Kommentaren, [S] SiteName.txt.

Ich habe versucht, die Zeichenfolge. Replace-Methode ohne Erfolg.

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

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

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

Ideen wäre sehr dankbar. Danke, ChrisM

+0

Es sollte Zitate um den Pfadnamen geben: '$ a = 'c: \ test \ [R] 10005404, fehlgeschlagen mit Kommentare, [S] SiteName.txt''. Ist das nur ein Tippfehler oder ist es in Ihrem Code? – Rynant

+0

Ein altes Windows [PowerShell-Tipp der Woche] (http://technet.microsoft.com/en-us/library/ff730956.aspx) erklärt warum und die Problemumgehungen. Dies ist eine Art doppelte Frage von [powershell get-childitem kann nicht mit Dateinamen umgehen, beginnend mit [Zeichen selbst mit Escapezeichen] (http://stackoverflow.com/a/9508802/608772) – JPBlanc

Antwort

21

Versuchen Sie, den -LiteralPath Parameter verwendet:

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

Eckige Klammern besondere Bedeutung haben.

Es ist eigentlich eine POSIX-Funktion, so können Sie dies tun:

dir [a-f]* 

Dies wird Ihnen alle Dinge in dem aktuellen Verzeichnis, die mit dem Buchstaben A beginnen durch F. Bash die gleiche Funktion hat.

5

Es gibt mindestens drei Möglichkeiten, um es zum Laufen zu bringen.

Mit etwas, das Ihrem Ansatz ähnelt, müssen Sie bei Verwendung von Anführungszeichen 2 Backticks hinzufügen, da ein einzelner Backtick als Escape-Zeichen ausgewertet wird, bevor er an die Replace-Methode gesendet wird.

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

einfache Anführungszeichen in der Replace Methode wird auch die Backticks verhindern, entfernt werden.

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

Schließlich könnten Sie den LiteralPath Parameter verwenden, die Platzhalter nicht verwenden (die eckigen Klammern werden von Powershell verwendet entspricht einer Menge von Zeichen zu definieren, die angepasst werden kann).

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

+1 Die ersten beiden sind ideale Lösungen, wenn sie benötigen Wildcards wie '* .txt' neben Dateien oder Ordnern mit' ['or'] 'im Namen zu verwenden – user66001