PowerShell 中存储在变量中的字符串的意外行为
Unexpected behavior with a string stored in a variable in PowerShell
我从 Excel 的 Cells.Find()
方法中得到了一些奇怪的行为:
我正在搜索的变量:
PS > $volumename
vol_01
PS > $volumename.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True String System.Object
没有结果:
PS > $sheet.Cells.Find($volumename).Row
但如果我手动复制并粘贴该变量的值:
PS > $volumename = "vol_01"
PS > $volumename.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True String System.Object
得到我期望的值:
PS > $sheet.Cells.Find($volumename).Row
198
在我看来,它们在各个方面都是完全相同的类型。并非每种情况都会发生这种情况。一些卷名可以正常通过,而另一些则不能。我擦除此 post 的卷名,因为它有客户命名约定。它与上面的格式相同,并且与有效的卷名格式相同。
以下代码片段可用于检查字符串中的隐藏控制字符:
PS> & { [int[]] [char[]] $Args[0] | % { '0x{0:x} [{1}]' -f $_, [char] $_ } } "vol_01`n"
0x76 [v]
0x6f [o]
0x6c [l]
0x5f [_]
0x30 [0]
0x31 [1]
0xa [
]
第一列是每个字符的 Unicode 代码点 ("ASCII code"),第二列是字符本身,包含在 [...]
中
请注意,我在字符串的末尾添加了 "`n"
- newline character (U+000A
) - 其代码点表示为十六进制。号码是 0xa
.
如果像您的情况一样,字符串中唯一不需要的部分是 尾随空格,您可以按如下方式删除它们:
$volumename.TrimEnd() # trim trailing whitespace
在你的例子中,尾随空格是 0xa0
,NO-BREAK SPACE (U+00A0
), which .TrimEnd()
also removes, as Tom Blodget 指出。
基于上述的简单函数包装器,用于管道输入:
filter debug-Chars { [int[]] [char[]] $_ | % { '0x{0:x} [{1}]' -f $_, [char] $_ } }
示例使用:
"vol_01`n" | debug-Chars
我从 Excel 的 Cells.Find()
方法中得到了一些奇怪的行为:
我正在搜索的变量:
PS > $volumename
vol_01
PS > $volumename.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True String System.Object
没有结果:
PS > $sheet.Cells.Find($volumename).Row
但如果我手动复制并粘贴该变量的值:
PS > $volumename = "vol_01"
PS > $volumename.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True String System.Object
得到我期望的值:
PS > $sheet.Cells.Find($volumename).Row
198
在我看来,它们在各个方面都是完全相同的类型。并非每种情况都会发生这种情况。一些卷名可以正常通过,而另一些则不能。我擦除此 post 的卷名,因为它有客户命名约定。它与上面的格式相同,并且与有效的卷名格式相同。
以下代码片段可用于检查字符串中的隐藏控制字符:
PS> & { [int[]] [char[]] $Args[0] | % { '0x{0:x} [{1}]' -f $_, [char] $_ } } "vol_01`n"
0x76 [v]
0x6f [o]
0x6c [l]
0x5f [_]
0x30 [0]
0x31 [1]
0xa [
]
第一列是每个字符的 Unicode 代码点 ("ASCII code"),第二列是字符本身,包含在 [...]
请注意,我在字符串的末尾添加了 "`n"
- newline character (U+000A
) - 其代码点表示为十六进制。号码是 0xa
.
如果像您的情况一样,字符串中唯一不需要的部分是 尾随空格,您可以按如下方式删除它们:
$volumename.TrimEnd() # trim trailing whitespace
在你的例子中,尾随空格是 0xa0
,NO-BREAK SPACE (U+00A0
), which .TrimEnd()
also removes, as Tom Blodget 指出。
基于上述的简单函数包装器,用于管道输入:
filter debug-Chars { [int[]] [char[]] $_ | % { '0x{0:x} [{1}]' -f $_, [char] $_ } }
示例使用:
"vol_01`n" | debug-Chars