Powershell 数据丢失原始格式

Powershell 数据丢失原始格式,powershell,Powershell,我对powershell比较陌生,对脚本有点奇怪的问题。我搜索了论坛,没有找到任何有用的东西 我遇到的问题是,当我通过我们在环境中使用的自定义协议将命令输出转换到base64或从base64传输时,它正在丢失格式。通过将命令字符串传递给IEX并将输出存储到变量,可以在远程系统上执行命令。我使用以下命令将输出转换为base64格式 $Bytes = [System.Text.Encoding]::Unicode.GetBytes($str1) $EncodedCmd = [Convert]::To

我对powershell比较陌生,对脚本有点奇怪的问题。我搜索了论坛,没有找到任何有用的东西

我遇到的问题是,当我通过我们在环境中使用的自定义协议将命令输出转换到base64或从base64传输时,它正在丢失格式。通过将命令字符串传递给IEX并将输出存储到变量,可以在远程系统上执行命令。我使用以下命令将输出转换为base64格式

$Bytes = [System.Text.Encoding]::Unicode.GetBytes($str1)
$EncodedCmd = [Convert]::ToBase64String($Bytes)
在另一端,当我们接收到输出时,我们使用命令转换回来

[System.Text.Encoding]::Unicode.GetString([System.Convert]::FromBase64String($EncodedCmd))
我遇到的问题是,尽管输出是正确的,但输出的格式已经丢失。例如,如果我运行ipconfig命令

 Windows IP Configuration   Ethernet adapter Local Area Connection 2:     Media State . . . . . . . . . . . : Media disconnected    Connection-specific DNS Suffix  . :   Ethernet 
adapter Local Area Connection 3:     Connection-specific DNS Suffix  . :     Link-local IPv6 Address . . . . . : fe80::3cd8:3c7f:c78b:a78f%14    IPv4 Address. . . . . . . . . . . 
: 192.168.10.64    Subnet Mask . . . . . . . . . . . : 255.255.255.0    Default Gateway . . . . . . . . . : 192.168.10.100  Ethernet adapter Local Area Connection:     Connection-sp
ecific DNS Suffix  . :     IPv4 Address. . . . . . . . . . . : 172.10.15.201    Subnet Mask . . . . . . . . . . . : 255.255.255.0    Default Gateway . . . . . . . . . : 172.10.15
1.200  Tunnel adapter isatap.{42EDCBE-8172-5478-AD67E-8A28273E95}:     Media State . . . . . . . . . . . : Media disconnected    Connection-specific DNS Suffix  . :   Tunnel ada
pter isatap.{42EDCBE-8172-5478-AD67E-8A28273E95}:     Media State . . . . . . . . . . . : Media disconnected    Connection-specific DNS Suffix  . :   Tunnel adapter isatap.{42EDCBE-8172-5478-AD67E-8A28273E95}:     Media State . . . . . . . . . . . : Media disconnected    Connection-specific DNS Suffix  . :   Tunnel adapter Teredo Tunneling Pseudo-Inter
face:     Media State . . . . . . . . . . . : Media disconnected    Connection-specific DNS Suffix  . : 

格式到处都是,很难阅读,我已经尝试过了,但是我找不到一个真正好的方法以正确的格式返回命令输出。非常感谢关于如何修复格式的任何想法这里发生的是
$str1
变量是一个字符串数组。它不包含换行符,但每行都在自己的行上

当变量转换为Base64时,数组中的所有行都链接在一起。这很容易看出:

$Bytes[43..60] | % { "$_ -> " + [char] $_}
0 ->
105 -> i
0 ->
111 -> o
0 ->
110 -> n
0 ->
32 ->
0 ->
32 ->
0 ->
32 ->
0 ->
69 -> E
0 ->
116 -> t
0 ->
104 -> h
这里的
0
是由双字节Unicode引起的。注意
32
space
字符。因此可以看到,源字符串中只有空格填充,没有行终止符

Windows IP Configuration


Ethernet
作为解决方案,可以添加换行符,也可以作为XML

通过将数组元素与
-join
连接,并使用
[Environment]::NewLine
作为分隔符,可以添加换行符。这样,

$Bytes = [System.Text.Encoding]::Unicode.GetBytes( $($str1 -join [environment]::newline))

$Bytes[46..67] | % { "$_ -> " + [char] $_}
105 -> i
0 ->
111 -> o
0 ->
110 -> n
0 ->
13 ->
0 ->
10 ->

0 ->
13 ->
0 ->
10 ->

0 ->
13 ->
0 ->
10 ->

0 ->
69 -> E
0 ->
116 -> t
0 ->
这里,
13
10
是Windows用于换行的
CR
LF
字符。添加换行符后,结果字符串看起来像源字符串。要知道,虽然看起来是一样的,但却不一样。源是字符串数组,结果是包含换行符的单个字符串


如果必须保留原始数据,则序列化是一种方法。

这似乎是数组布局的问题。如何填充
$str1
变量?感谢您的精彩解释,我们将尝试一下