数据丢失原始格式

时间:2017-05-28 04:45:59

标签: powershell

我对PowerShell相对较新,并且对脚本有一点奇怪的问题。我搜索了论坛,并且找不到任何可行的东西。

我遇到的问题是,当我通过我们在环境中使用的自定义协议转换输出和从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  . : 

格式化遍布整个地方并且难以阅读,我已经玩了一些,但我找不到以正确格式返回命令输出的非常好的方法。欣赏有关如何修复格式的任何想法

1 个答案:

答案 0 :(得分:2)

这里发生的是$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的{​​{1}}。所以我们看到只有空间填充,源字符串中没有行终止符

Windows IP Configuration


Ethernet

作为解决方案,可以添加换行符或serialize the whole array作为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 ->

此处,1310是Windows用于换行的CRLF个字符。添加换行符后,结果字符串看起来像源。请注意,认为它看起来相同,它相同。 Source是一个字符串数组,结果是包含换行符的单个字符串。

如果你必须保留原始版本,那么序列化是可行的方法。