如何在Powershell中访问包含特殊字符的文件路径?

时间:2012-08-23 11:14:05

标签: powershell

我从Java应用程序(通过Windows命令提示符)中调用powershell来读取各种文件属性。

e.g。

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中具有特定功能, -literalPath 参数似乎不起作用。 我尝试用双引号括起路径或用`字符逃避,但这也没有解决我的问题: - (

有关如何将文件路径传递给Powershell的任何建议,其中可能包含空格,单引号,方括号,&符号,美元符号等?

更新 的 这里的某个人已经向我展示了如何在Powershell中实现它,但不知怎的,答案已被删除了? 无论如何,我确实创建了一个名为$ & ' [].txt的文件。 这适用于 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命令会给出完全相同的错误消息...

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

3 个答案:

答案 0 :(得分: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/

答案 1 :(得分:7)

如果您可以编写临时txt文件的路径,则以下工作正常:

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

文件@ C:\ Temp \ path.txt包含其中包含特殊字符的路径,除此之外,我认为您必须在每个路径的基础上转义每个特殊字符。

除了上面的黑客攻击之外,看起来Powershell V3可以通过增加一个新的“魔术参数”语言功能来帮助你。具体来说,请参阅“从Cmd.exe轻松重用命令行”here这一节,因为我讨厌链接腐烂,在这里,它是无耻地复制在下面:

  

从Cmd.exe轻松重用命令行

     

Web上充满了为Cmd.exe编写的命令行。这些命令   在PowerShell中,行经常工作,但当它们包含某些内容时   字符,例如分号(;)美元符号($)或花括号,   你必须做一些改变,可能会添加一些引号。这个   似乎是许多轻微头痛的根源。

     

为了帮助解决这个问题,我们添加了一种新的方法来“逃避”   解析命令行。如果你使用魔术参数 - %,我们就会停止   我们正常解析你的命令行并切换到很多东西   简单。我们不匹配报价。我们不会以分号停止。我们   不要展开PowerShell变量。我们确实扩展了环境变量   如果您使用Cmd.exe语法(例如%TEMP%)。除此之外,   直到行尾(或管道,如果你是管道)的参数是   按原样通过。这是一个例子:

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

答案 2 :(得分:4)

这个帖子已经有5年了,所以可能时间已经改变了,但是对我来说当前的答案是使用反引号(`)符号来逃避特殊字符。

在我的情况下,它是一个失败的目录路径中的美元符号。通过在美元符号前面加上反击,一切正常。

在:

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

后:

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