带有反斜杠的Powershell哈希表Get_Item

时间:2014-08-05 08:04:08

标签: powershell

有人可以解释为什么散列表的Get_Item在写入主机时的行为与变量不同吗?

以下代码:

$filePathA = "\\server\folderA"
$filePathB = "\\server\folderB"

$here = @'
FilePathA = \\server\folderA
FilePathB = \\server\folderB
'@

$hashtable = ConvertFrom-StringData -stringdata $here

Write-Host $filePathA
Write-Host $hashtable.Get_Item("FilePathA")

Powershell ISE中的输出:

\\server\folderA
\server
olderA

是否可以阻止Get_Item的这种行为,使其行为与变量相同?

提前致谢, 麦克

3 个答案:

答案 0 :(得分:2)

行为不是由Get_Item引起的,而是由您的输入引起的。 ConvertFrom-StringData假定正确转发的数据as per the documentation

  

ConvertFrom-StringData支持转义字符序列   传统的机器翻译工具允许。也就是说,cmdlet   可以将反斜杠()解释为字符串数据中的转义字符   通过使用Regex.Unescape方法,而不是Windows PowerShell   反引号字符(`)通常表示一行的结尾   一个脚本。在here-string中,反引号字符没有   工作。您还可以在结果中保留文字反斜杠   使用前面的反斜杠转义它,如下所示:\。 未逸出   反斜杠字符,例如文件中常用的字符   路径,可以在结果中呈现为非法转义序列

因此,哈希表已包含垃圾数据:

$hashtable

Name                           Value
----                           -----
FilePathA                      \server♀olderA
FilePathB                      \server♀olderB

正确的逃避有助于:

$here = @'
FilePathA = \\\\server\\folderA
FilePathB = \\\\server\\folderB
'@

$hashtable = ConvertFrom-StringData -stringdata $here
$hashtable

Name                           Value
----                           -----
FilePathA                      \\server\folderA
FilePathB                      \\server\folderB

为了avoid manual escaping[Regex]::Escape()可以像这样使用,

# Build similar a string
$here2 = $("FilePathA = {0}`nFilePathB = {1}" -f [Regex]::Escape("\\server\folderA"), [Regex]::Escape("\\server\folderB") )

$here2
FilePathA = \\\\server\\folderA
FilePathB = \\\\server\\folderB

$hashtable2 = ConvertFrom-StringData -stringdata $here2
$hashtable2

Name                           Value
----                           -----
FilePathA                      \\server\folderA
FilePathB                      \\server\folderB

答案 1 :(得分:0)

如果您阅读ConvertFrom-StringData文档:

  

ConvertFrom-StringData支持转义字符序列   传统的机器翻译工具允许。也就是说,cmdlet   可以将反斜杠()解释为字符串数据中的转义字符   通过使用Regex.Unescape方法,而不是Windows PowerShell   反引号字符(`)通常表示一行的结尾   一个脚本。在here-string中,反引号字符没有   工作。您还可以在结果中保留文字反斜杠   使用前面的反斜杠转义它,如下所示:\。非转义   反斜杠字符,例如文件中常用的字符   路径,可以在结果中呈现为非法转义序列。

因此,在一种情况下,您的双反斜杠被视为转义序列而不是另一种情况。

答案 2 :(得分:0)

我知道这有点旧,但是您也可以“重新处理”原始字符串,请注意它看起来确实很奇怪:

./gradlew clean jacocoTestReport (name of jacoco task)
./gradlew sonarqube (<- mark this)