2012-08-23 125 views
12

我在Java應用程序內(通過Windows命令提示符)調用powershell來讀取各種文件屬性。如何在包含特殊字符的Powershell中訪問文件路徑?

例如

powershell (get-item 'C:\Users\erlpm\Desktop\Temp\s p a c e s.txt').creationTime 

我用單引號括住文件路徑,因爲它可能包含空格。 它工作正常,直到我遇到包含方括號的文件路徑,這似乎被解釋爲通配符。我設法通過加入-LiteralPath參數來解決這個問題:

powershell (get-item -literalpath 'C:\Users\erlpm\Desktop\Temp\brackets[].txt').creationTime 

到目前爲止,一切都很好... 但文件路徑也可以包含單引號,美元符號與符號,......所有這些字符在PowerShell中似乎有一個特定的功能,其參數似乎不起作用。 我嘗試用雙引號括住路徑或用字符轉義,但是這並沒有解決我的問題:-(

有關如何將文件路徑傳遞到Powershell的任何建議,可能包含空格,單引號,方括號,&號,美元符號等

更新:??這裏 有人已經告訴我如何把它在PowerShell中的工作,但不知何故,答案已被刪除
無論如何,我做創建一個名爲$ & ' [].txt的文件。 This works form Powershell的(需要逃離&):

PS C:\Users\erlpm> Get-Item -LiteralPath "C:\Users\erlpm\Desktop\Temp\`$ & ' [].txt" 


    Directory: C:\Users\erlpm\Desktop\Temp 


Mode    LastWriteTime  Length Name 
----    -------------  ------ ---- 
-a---  2012-08-23  14:22   0 $ & ' [].txt 

但是,當我直通Windows命令提示符下執行相同的PowerShell命令,...

C:\Users\erlpm>powershell Get-Item -LiteralPath "C:\Users\erlpm\Desktop\Temp\`$ & ' [].txt" 

...我得到這個錯誤:

Ampersand not allowed. The & operator is reserved for future use; use "&" to pass ampersand as a string. 
At line:1 char:55 
+ Get-Item -LiteralPath C:\Users\erlpm\Desktop\Temp\`$ & <<<< ' [].txt 
    + CategoryInfo   : ParserError: (:) [], ParentContainsErrorRecordException 
    + FullyQualifiedErrorId : AmpersandNotAllowed 

使用-command參數,並把之間的powershell命令3210給出了完全同樣的錯誤信息......

C:\Users\erlpm>powershell -command {Get-Item -LiteralPath "C:\Users\erlpm\Desktop\Temp\`$ & ' [].txt"} 
+0

你能提供的未工作路徑的幾個例子,你會得到確切的錯誤?到目前爲止,您只提供了工作路徑,因此很難確定問題出在哪裏。 – latkin

+0

我更新了我的問題,並添加了一些工作和非工作示例。正如你所看到的,我可以在Powershell提示符下運行它,但不能通過Windows命令提示符執行powershell。 –

+0

我通過創建名爲「$ *'[] .txt」的文件來重現您的問題。然後,從powershell提示符下,我輸入get-item ,powershell完成了我的文件名,但是我無法在這裏粘貼完成的文件名,因爲markdown會吃掉所有特殊字符。嘗試一下,看看是否有幫助。 – joXn

回答

7

如果你能寫的路徑到一個臨時txt文件,下面的工作確定:

(get-item -literalpath (gc 'C:\Temp\path.txt')).creationTime 

文件@ C:\ TEMP \路徑.txt包含其中包含特殊字符的路徑,除此之外,我認爲您必須在每個路徑的基礎上轉義每個特殊字符。

除了上面的破解之外,Powershell V3可能會在這裏增加一個新的'magic parameter'語言功能。具體來說,看到標題爲「命令行的更容易重複使用的Cmd.exe」 here的部分,因爲我討厭鏈接腐,這是您要耍賴轉載如下:

更容易複用命令行模式從Cmd的的。exe

該網站充滿了爲Cmd.exe編寫的命令行。這些命令 行在PowerShell中經常運行得足夠多,但是當它們包含某些 字符(例如,一個分號(;)一個美元符號($)或花括號, 你必須做一些修改,可能會添加一些引號。這個 似乎是許多輕微頭痛的來源。

爲了解決這種情況,我們添加了一種新的方式來「逃避」命令行解析。如果你使用魔術參數 - %,我們會停止對你的命令行的正常解析並切換到更簡單的東西 。我們不匹配引號。我們不停止分號。我們 不擴展PowerShell變量。如果您使用Cmd.exe語法(例如%TEMP%),我們會擴展環境變量 。除此之外,直到行尾(或管道,如果你是管道)的參數 是 按原樣傳遞。這裏有一個例子:

echoargs.exe --% %USERNAME%,this=$something{weird} 
Arg 0 is <jason,this=$something{weird}> 
8

這的確是一個約cmd.exe的字符串轉義,那麼問題。結合cmd和powershell字符串轉義是一個完全的噩夢。經過不少次嘗試,我得到了您的具體示例工作:

C:\Users\latkin>powershell.exe -nologo -noprofile -command ^&{ dir -LiteralPath ^"""".\`$ & ' [].txt"" } 

    Directory: C:\Users\latkin 
Mode    LastWriteTime  Length Name 
----    -------------  ------ ---- 
-a---   8/23/2012 8:46 AM   0 $ & ' [].txt 

完全直觀,對嗎?

您每次都可以花費15分鐘的時間與轉義序列摔跤,或者您可以嘗試其他一些appraoches。

將文件名放在文本文件中,然後將其讀出。

C:\> powershell.exe -command "&{dir -literal (gc .\filename.txt) }" 

使用腳本

C:\> powershell.exe -file .\ProcessFiles.ps1 # in processfiles.ps1 you are in fully powershell environment, so escaping is easier 

使用-EncodedCommand

powershell.exe -?(最後一項顯示)或http://dmitrysotnikov.wordpress.com/2011/07/06/passing-parameters-to-encodedcommand/

+0

正如你所建議的,我放棄了試圖逃避特殊字符並將文件路徑寫入臨時文件。這似乎工作正常! 2017年backtick中的 –

2

此線程5歲,所以可能時間已經改變,但目前的答案對我來說是使用反引號(`)符號來逃避特殊字符。

在我的情況下,它是失敗的目錄路徑中的美元符號。通過在美元符號前加上反手,一切都奏效了。

前:

$dir = "C:\folder$name\dir" # failed 

後:

$dir = "C:\folder`$name\dir" # succeeded 
+0

完美運作 –

相關問題