如何解决Powershell强制将ConvertFrom-Json输出转换为字符串,然后可以在所有字符串操作中使用它,包括文件命名
正如我在“问题”标题中提到的那样,我想将ConvertFrom-Json
命令的输出转换为字符串,这样我得到的字符/字符串应该可以使用,以便可以将其插入到DateTime字符串中作为替换字符串到另一个角色。
$DTCurr = (Get-Date).tostring("dd-MM-yyyy_hh+mm+ss")
现在在上面的代码中,我想用冒号强制替换加号,以便可以在文件命名中使用生成的DateTime字符串,因此我期望输出(替换后)如下: / p>
07-11-2020_12:59:13
现在,我尝试使用此代码进行强制替换,但这不起作用:
$colon = ('{ "str": "\uA789" }' | ConvertFrom-Json)
$DTCurr = (Get-Date).tostring("dd-MM-yyyy_hh+mm+ss")
$DTCurr = $DTCurr -replace "\+",$colon
Echo $DTCurr
这给出了输出:07-11-2020_02@{str=꞉}06@{str=꞉}28
,这是荒谬的和意外的。我可以确保$colon
在传递给:
时确实会打印Echo
。
有人可以让我知道我做错了什么,并帮助实现这一目标吗?
解决方法
很抱歉,如果我误解了这一点,但我认为这样做可以简化您的最终目标
$DTCurr = (Get-Date).tostring("dd-MM-yyyy_hh:mm:ss")
或这个
$DTCurr = (Get-Date).tostring("dd-MM-yyyy_hh+mm+ss")
$colonDT = $DTCurr -replace "\+",":"
但是,如果您想按自己的方式进行操作,则之所以要打印输出,是因为它确实在执行您要告诉它的操作。您将+
替换为对象,该对象具有名为str
且值为:
的属性。您需要这样做
$colon = ('{ "str": "\uA789" }' | ConvertFrom-Json)
$DTCurr = (Get-Date).tostring("dd-MM-yyyy_hh+mm+ss")
$colonDT = $DTCurr -replace "\+",$colon.str
Echo $colonDT
如果我不正确,并且您需要更多帮助,请告诉我。
,PowerShellGuy's helpful answer解决了您的问题;让我补充一下:
tl; dr
# Use a [char] cast with the Unicode code point to create the char.
# of interest - no need for using JSON for that.
PS> (Get-Date).ToString('dd-MM-yyyy_hh+mm+ss') -replace '\+',[char] 0xA789
06-11-2020_09꞉17꞉25
似乎您使用JSON表示形式的唯一原因是要获得一个Unicode字符超出ANSI / ASCII范围的字符串,即꞉
(MODIFIER LETTER COLON,{{3 }}),它看上去像ASCII范围:
(冒号,U+A789
)一样,但不是。
如果我们假设您需要此JSON绕行路线-而您并不需要-最简单的解决方案是:
$colonSubstitute = '"\uA789"' | ConvertFrom-Json
不需要JSON绕行,因为您可以将Unicode代码点直接转换为[char]
(U+003A
):
# Directly creates Unicode char. U+A789 as a [char] (System.Char) instance.
$colonSubstitute = [char] 0xA789
您可以将其强制转换为[string]
实例,但是鉴于PowerShell的自动,灵活的类型转换(见下文),通常不必这样做:
$colonSubstitute = [string] [char] 0xA789
PowerShell [Core] v6 + 直接在双引号字符串("..."
)中支持Unicode转义序列(类似于JSON) >,也称为System.Char
,使用语法`u{n}
,其中n
是字符的Unicode代码点:
# PowerShell [Core] v6+ escape sequence
# Same as: "$([char] 0xA789)"
$colonSubstitute = "`u{A789}"
注意:与[char]
强制转换不同,`u{n}
语法还支持Unicode BMP(expandable (interpolating) strings) 以外的字符,即代码点大于U+FFFF
(0xFFFF
);例如,"`u{1F913}"
代表?
。但是,在生成的(扩展的)字符串中,此类字符表示为两个 [char]
(System.Char
)实例,即所谓的代理对,因为.NET字符为 UTF-16,即 16位代码单元,最大值0xFFFF
,因此不能直接表示非BMP字符;因此,例如"`u{1F913}".Length
产生2
。
在 Windows PowerShell 中,您可以使用$(...)
,Basic Multilingual Plane,嵌入{ {1}}在双引号字符串([char]
)中进行强制转换:
"..."
注意:如前所述,$colonSubstitute = "$([char] 0xA789)"
([char]
)强制转换仅限于Unicode BMP中的字符。虽然总体上很少出现非BMP范围内的字符(代码点System.Char
及以上),但 emoji 确实需要它们,例如0x10000
(NERD FACE,{{ 3}})。
与PowerShell [Core] v6 +语法不同,使用?
强制转换来代表代理对既不明显也不方便:
例如,要表示[char]
,您必须(a)知道非BMP代码点?
被表示为UTF-16代理对U+1F913
,0xD83E
,然后以以下两种形式之一嵌入后者:0xDD13
或"$(-join [char[]] (0xD83E,0xDD13))"
最后,考虑到PowerShell的自动,灵活的类型转换,您可以直接使用"$([char] 0xD83E)$([char] 0xDD13)"
实例作为subexpression operator的操作数:
[char]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。