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