尝试将Powershell代码简化为单行

尝试将Powershell代码简化为单行,powershell,Powershell,下面的代码片段获取路径列表,将每个路径的每个字符转换为其ASCII值,并将其存储在名为$output的变量中 $itemlist = (Get-ChildItem -Recurse -Path "$data_path").FullName Foreach($item in $itemlist) { $output+= [int[]]@("$item").ToCharArray() -join ',' | Out-String } Write-Host $out

下面的代码片段获取路径列表,将每个路径的每个字符转换为其ASCII值,并将其存储在名为$output的变量中

 $itemlist = (Get-ChildItem -Recurse -Path "$data_path").FullName 
 Foreach($item in $itemlist)
    { 
     $output+= [int[]]@("$item").ToCharArray() -join ',' | Out-String
    }
 Write-Host $output
 $itemlist = (Get-ChildItem -Recurse -Path "$data_path").FullName 
 Foreach($item in $itemlist)
    { 
     $output+= [int[]]@("$item").ToCharArray() -join ',' | Out-String
    }
 Write-Host $output
我试图在一行中实现所有这些(由于一个复杂的原因,它阻止我运行Powershell脚本),这样我就可以运行一个Powershell命令来获得相同的效果,但到目前为止,我遇到了困难

以下是我所取得的成就

(Get-ChildItem -Recurse -Path "$data_path").FullName | Format-Table -Property @{n='';e={[int[]]@($_).ToCharArray() -join ','}} | Out-Host

但是,输出没有ASCII值,输出中的路径以字符表示。有人能帮我解决这个问题吗

我想你可以用这个:

$itemlist = (Get-ChildItem -Recurse -Path "$data_path").FullName; Foreach($item in $itemlist){$output+= [int[]]@("$item").ToCharArray() -join ',' | Out-String};Write-Host $output
(Get-ChildItem -Recurse -Path "$data_path").FullName | ForEach-Object { [int[]]@("$_").ToCharArray() -join ',' } | Out-String

到目前为止,我所能想到的就是使用别名来进一步缩短它:

ls "$data_path" -r | %{[int[]]@($_.FullName).ToCharArray() -join ","} | Out-String
如果您是从
cmd.exe
运行此命令,应该如何执行此操作:

$Command = @'
$itemlist = (Get-ChildItem -Recurse -Path "$data_path").FullName 
Foreach($item in $itemlist)
{ 
    $output+= [int[]]@("$item").ToCharArray() -join ',' | Out-String
}
Write-Host $output
'@
[Convert]::ToBase64String([Text.Encoding]::Unicode.GetBytes($Command))
最终结果:

powershell.exe -NoProfile -NoLogo -EncodedCommand JABpAHQAZQBtAGwAaQBzAHQAIAA9ACAAKABHAGUAdAAtAEMAaABpAGwAZABJAHQAZQBtACAALQBSAGUAYwB1AHIAcwBlACAALQBQAGEAdABoACAAIgAkAGQAYQB0AGEAXwBwAGEAdABoACIAKQAuAEYAdQBsAGwATgBhAG0AZQAgAAoAIABGAG8AcgBlAGEAYwBoACgAJABpAHQAZQBtACAAaQBuACAAJABpAHQAZQBtAGwAaQBzAHQAKQAKACAAIAAgACAAewAgAAoAIAAgACAAIAAgACQAbwB1AHQAcAB1AHQAKwA9ACAAWwBpAG4AdABbAF0AXQBAACgAIgAkAGkAdABlAG0AIgApAC4AVABvAEMAaABhAHIAQQByAHIAYQB5ACgAKQAgAC0AagBvAGkAbgAgACcALAAnACAAfAAgAE8AdQB0AC0AUwB0AHIAaQBuAGcACgAgACAAIAAgAH0ACgAgAFcAcgBpAHQAZQAtAEgAbwBzAHQAIAAkAG8AdQB0AHAAdQB0AA==

如果这变成一场简短的比赛

ls $data_path -r|%{($_|% f*|% t*y|% toi*2 $null)-join','}|out-string

我正试图在一行中实现所有这些(由于一个复杂的原因,我无法运行Powershell脚本),以获得与原始代码相同的结果,我相信您必须将
字符串
从循环中取出-事实上甚至不需要它…为什么不使用
-EncodedCommand
“ASCII值”,您指的是UTF-16代码单位。路径使用Unicode字符集。字符是UTF-16代码单位,一个或两个编码Unicode代码点。
ls $data_path -r|%{($_|% f*|% t*y|% toi*2 $null)-join','}|out-string