2016-01-13 74 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"