我对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 . :
格式化遍布整个地方并且难以阅读,我已经玩了一些,但我找不到以正确格式返回命令输出的非常好的方法。欣赏有关如何修复格式的任何想法
答案 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 ->
此处,13
和10
是Windows用于换行的CR
和LF
个字符。添加换行符后,结果字符串看起来像源。请注意,认为它看起来相同,它不相同。 Source是一个字符串数组,结果是包含换行符的单个字符串。
如果你必须保留原始版本,那么序列化是可行的方法。