Powershell 强制将 ConvertFrom-Json 输出转换为字符串,然后可以将其用于所有字符串操作,包括。文件命名
Powershell force convert the ConvertFrom-Json output to string which can then be used in all string operations incl. filenaming
正如我在问题标题中提到的,我想将 ConvertFrom-Json
命令的输出转换为字符串,这样,我得到的 character/string 应该可用,这样它就可以插入到DateTime 字符串作为另一个字符的替换。
目前我有以下代码来获取当前日期时间:
$DTCurr = (Get-Date).tostring("dd-MM-yyyy_hh+mm+ss")
现在在上面的代码中,我想强制用冒号替换加号,这样生成的 DateTime 字符串就可以在 file-naming 中使用,所以我期待输出(替换后)如下所示:
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
如果我不正确,您需要更多帮助,请告诉我。
解决了你的问题;让我补充一下:
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-range 的字符串,即 ꞉
(修饰符字母冒号,U+A789
), which looks just like the ASCII-range :
(COLON, U+003A
),但不是。
如果我们假设您需要这个 JSON 绕道 - 而您不需要 - 最简单的解决方案是:
$colonSubstitute = '"\uA789"' | ConvertFrom-Json
不需要JSON绕路,因为你可以直接将Unicode代码点转换为[char]
(System.Char
):
# 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的) 在 double-quoted 字符串 ("..."
) 中,也称为 expandable (interpolating) strings,使用语法 `u{n}
,其中 n
是字符的 Unicode 代码点数:
# PowerShell [Core] v6+ escape sequence
# Same as: "$([char] 0xA789)"
$colonSubstitute = "`u{A789}"
注意:与 [char]
转换不同,`u{n}
语法还支持 超出 Unicode BMP (Basic Multilingual Plane) 的字符,即字符代码点大于 U+FFFF
(0xFFFF
);例如,"`u{1F913}"
对应 </code>。但是,在生成的(扩展的)字符串中,此类字符表示为 <em>two</em> <code>[char]
(System.Char
) 个实例,so-called surrogate pairs,因为 .NET 字符是 UTF-16,即 16 位 代码单元 ,最大。 0xFFFF
的值,因此不能直接表示 non-BMP 个字符;因此,例如,"`u{1F913}".Length
产生 2
.
在WindowsPowerShell中,您可以使用$(...)
, subexpression operator, 将 [char]
转换嵌入 double-quoted 字符串 ("..."
):
$colonSubstitute = "$([char] 0xA789)"
注意:如前所述,[char]
(System.Char
) 转换仅限于 Unicode BMP 中的字符。虽然 non-BMP 范围内的字符(代码点 0x10000
及以上)总体上很少见,但 表情符号 确实需要它们,例如 </code>(书呆子脸,<a href="http://www.fileformat.info/info/unicode/char/1F913/index.htm%7D" rel="nofollow noreferrer">U+1F913</a>)。
与 PowerShell [Core] v6+ 语法不同,使用 <code>[char]
转换来表示代理对既不明显也不方便:
例如,要表示 </code>,您必须 (a) 知道 non-BMP 代码点 <code>U+1F913
表示为 UTF-16 代理项对 0xD83E
, 0xDD13
, 然后将后者嵌入这两种形式中的任何一种:
"$(-join [char[]] (0xD83E, 0xDD13))"
或 "$([char] 0xD83E)$([char] 0xDD13)"
最后,考虑到 PowerShell 自动、灵活的类型转换,您可以直接使用 [char]
实例作为 -replace
operator:
的操作数
PS> (Get-Date).ToString('dd-MM-yyyy_hh+mm+ss') -replace '\+', [char] 0xA789
06-11-2020_09꞉17꞉25
正如我在问题标题中提到的,我想将 ConvertFrom-Json
命令的输出转换为字符串,这样,我得到的 character/string 应该可用,这样它就可以插入到DateTime 字符串作为另一个字符的替换。
目前我有以下代码来获取当前日期时间:
$DTCurr = (Get-Date).tostring("dd-MM-yyyy_hh+mm+ss")
现在在上面的代码中,我想强制用冒号替换加号,这样生成的 DateTime 字符串就可以在 file-naming 中使用,所以我期待输出(替换后)如下所示:
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
如果我不正确,您需要更多帮助,请告诉我。
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-range 的字符串,即 ꞉
(修饰符字母冒号,U+A789
), which looks just like the ASCII-range :
(COLON, U+003A
),但不是。
如果我们假设您需要这个 JSON 绕道 - 而您不需要 - 最简单的解决方案是:
$colonSubstitute = '"\uA789"' | ConvertFrom-Json
不需要JSON绕路,因为你可以直接将Unicode代码点转换为[char]
(System.Char
):
# 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的) 在 double-quoted 字符串 ("..."
) 中,也称为 expandable (interpolating) strings,使用语法 `u{n}
,其中 n
是字符的 Unicode 代码点数:
# PowerShell [Core] v6+ escape sequence
# Same as: "$([char] 0xA789)"
$colonSubstitute = "`u{A789}"
注意:与 [char]
转换不同,`u{n}
语法还支持 超出 Unicode BMP (Basic Multilingual Plane) 的字符,即字符代码点大于 U+FFFF
(0xFFFF
);例如,"`u{1F913}"
对应 </code>。但是,在生成的(扩展的)字符串中,此类字符表示为 <em>two</em> <code>[char]
(System.Char
) 个实例,so-called surrogate pairs,因为 .NET 字符是 UTF-16,即 16 位 代码单元 ,最大。 0xFFFF
的值,因此不能直接表示 non-BMP 个字符;因此,例如,"`u{1F913}".Length
产生 2
.
在WindowsPowerShell中,您可以使用$(...)
, subexpression operator, 将 [char]
转换嵌入 double-quoted 字符串 ("..."
):
$colonSubstitute = "$([char] 0xA789)"
注意:如前所述,[char]
(System.Char
) 转换仅限于 Unicode BMP 中的字符。虽然 non-BMP 范围内的字符(代码点 0x10000
及以上)总体上很少见,但 表情符号 确实需要它们,例如 </code>(书呆子脸,<a href="http://www.fileformat.info/info/unicode/char/1F913/index.htm%7D" rel="nofollow noreferrer">U+1F913</a>)。
与 PowerShell [Core] v6+ 语法不同,使用 <code>[char]
转换来表示代理对既不明显也不方便:
例如,要表示 </code>,您必须 (a) 知道 non-BMP 代码点 <code>U+1F913
表示为 UTF-16 代理项对 0xD83E
, 0xDD13
, 然后将后者嵌入这两种形式中的任何一种:
"$(-join [char[]] (0xD83E, 0xDD13))"
或 "$([char] 0xD83E)$([char] 0xDD13)"
最后,考虑到 PowerShell 自动、灵活的类型转换,您可以直接使用 [char]
实例作为 -replace
operator:
PS> (Get-Date).ToString('dd-MM-yyyy_hh+mm+ss') -replace '\+', [char] 0xA789
06-11-2020_09꞉17꞉25