微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Powershell强制将ConvertFrom-Json输出转换为字符串,然后可以在所有字符串操作中使用它,包括文件命名

如何解决Powershell强制将ConvertFrom-Json输出转换为字符串,然后可以在所有字符串操作中使用它,包括文件命名

正如我在“问题”标题中提到的那样,我想将ConvertFrom-Json命令的输出转换为字符串,这样我得到的字符/字符串应该可以使用,以便可以将其插入到DateTime字符串中作为替换字符串到另一个角色。

目前,我有以下代码获取当前的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+FFFF0xFFFF);例如,"`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+1F9130xD83E ,然后以以下两种形式之一嵌入后者:
0xDD13"$(-join [char[]] (0xD83E,0xDD13))"


最后,考虑到PowerShell的自动,灵活的类型转换,您可以直接使用"$([char] 0xD83E)$([char] 0xDD13)"实例作为subexpression operator的操作数:

[char]

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。