有人可以解释为什么散列表的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的这种行为,使其行为与变量相同?
提前致谢, 麦克
答案 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)