2016-01-13 69 views
1

我已經在腳本文件中的以下的PowerShell:在PowerShell中逃脫冒號的方法是什麼?

cd "$env:systemdrive:\$env:APPDATA\Mozilla\Firefox\Profiles\*.default" 

擴大,我想這個做類似這樣的東西:

cd "C:\Users\Bob\AppData\Roaming\Mozilla\Firefox\Profiles\f1wkii3l.default" 

但是當我運行它,我得到:

cd : Cannot find drive. A drive with the name '\C' does not exist.

我猜我冒充的那個冒號在C:\的末尾是導致問題的原因。

我想:

cd "${env:systemdrive}:\${env:APPDATA}\Mozilla\Firefox\Profiles\*.default" 

但後來我得到的錯誤:

cd : Cannot find a provider with the name 'C'.

我怎樣才能逃避冒號使PowerShell的只是將其視爲普通的文本?

注意:我看了這個問題:Escaping a colon in powershell和答案都是關於.NET,並沒有回答我的問題(雖然問題是非常相似)。

回答

2

其他答案適用於故障排除和您的任務。我有一個建議,而我認爲最好的做法是在任何時候處理路徑時使用Join-Path,這樣您就不必擔心尾隨或開始路徑分隔符。

這個例子

$d1 = "${env:APPDATA}\Mozilla\Firefox\Profiles\*.default" 
$d2 = Join-Path ${env:APPDATA} "\Mozilla\Firefox\Profiles\*.default" 
$d3 = Join-Path ${env:APPDATA} "Mozilla\Firefox\Profiles\*.default" 
Write-Output "d1 = '$d1'" 
Write-Output "d2 = '$d2'" 
Write-Output "d3 = '$d3'" 

可生產

d1 = 'C:\Users\xxx\AppData\Roaming\Mozilla\Firefox\Profiles\*.default' 
d2 = 'C:\Users\xxx\AppData\Roaming\Mozilla\Firefox\Profiles\*.default' 
d3 = 'C:\Users\xxx\AppData\Roaming\Mozilla\Firefox\Profiles\*.default' 

全部都接受,我會傾向於在自己的腳本,以使用d3版本。

+0

這應該是公認的答案,因爲Join-Path回答瞭如何使用Powershell轉義路徑的第二個問題(不使用.Net方法) – JGreenwell

2

你不需要在那裏轉義任何東西。該APPDATA環境變量已經包含了驅動器,所以你只需要

cd "${env:APPDATA}\Mozilla\Firefox\Profiles\*.default" 

${env:systemdrive}:\${env:APPDATA}將創建一個路徑C:\C:\Users\...,這確實是無效的。

2

如果write-host這些環境變量,你會發現:

PS C:\>write-host $env:systemdrive 
C: 

PS C:\>write-host $env:appdata 
C:\Users\****\AppData\Roaming 

所以你當前的嘗試擴展到C:C:\Users\****\AppData\Roaming\... 因此,所有你需要的是命令:

cd "$env:Appdata\Mozilla\Firefox\Profiles\*.default"