如何将很长的类似脚本的行变成单行?
how to turn a long, script-like line into a single line?
我试图将下面的命令转换为单行,但无济于事。我试过放更多的 apsas、大括号、方括号,但什么也没有。
$PBIFolder = Get-ChildItem -Path "$env:AllUsersProfile\Package Cache\" -Filter "PBIDesktopSetup_x64.exe" -Recurse
$PBISetup = $env:SystemDrive+$PBIFolder.PSParentPath.Split(':')[3]+"\PBIDesktopSetup_x64.exe"
Start-Process $PBISetup '/uninstall /quiet' -Wait
我试过这种方法,但没有成功
powershell.exe -noprofile -noninteractive -command ($PBIFolder = Get-ChildItem -Path "$env:AllUsersProfile\Package Cache\" -Filter "PBIDesktopSetup_x64.exe" -Recurse; $PBISetup = $env:SystemDrive+$PBIFolder.PSParentPath.Split(':')[3]+"\PBIDesktopSetup_x64.exe"; Start-Process $PBISetup -Parameters '/uninstall /quiet' -Wait)
尝试:
powershell.exe '-noprofile -noninteractive -command &($PBIFolder = Get-ChildItem -Path "$env:AllUsersProfile\Package Cache\" -Filter "PBIDesktopSetup_x64.exe" -Recurse; $PBISetup = $env:SystemDrive+$PBIFolder.PSParentPath.Split(':')[3]+"\PBIDesktopSetup_x64.exe"; Start-Process $PBISetup -Parameters '/uninstall /quiet' -Wait)'
当我有较长的脚本需要在不依赖外部脚本文件的情况下内联执行时,我喜欢使用另一种方法。
我没有尝试将所有内容放在一行中,而是使用 Powershell.exe
的 -EncodedCommand
参数。这样,就不会出现任何问题,因为编码命令是脚本的 Base 64 字符串表示形式。
要获得正确的调用,您需要先将脚本转换为 Base64 字符串。看看我是如何包装你的脚本的。
[System.Convert]::ToBase64String(
[System.Text.Encoding]::Unicode.GetBytes({
$PBIFolder = Get-ChildItem -Path "$env:AllUsersProfile\Package Cache\" -Filter "PBIDesktopSetup_x64.exe" -Recurse
$PBISetup = $env:SystemDrive + $PBIFolder.PSParentPath.Split(':')[3] + "\PBIDesktopSetup_x64.exe"
Start-Process $PBISetup '/uninstall /quiet' -Wait
}))
我们从中得到的字符串是:
"CgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAkAFAAQgBJAEYAbwBsAGQAZQByACAAPQAgAEcAZQB0AC0AQwBoAGkAbABkAEkAdABlAG0AIAAtAFAAYQB0AGgAIAAiACQAZQBuAHYAOgBBAGwAbABVAHMAZQByAHMAUAByAG8AZgBpAGwAZQBcAFAAYQBjAGsAYQBnAGUAIABDAGEAYwBoAGUAXAAiACAALQBGAGkAbAB0AGUAcgAgACIAUABCAEkARABlAHMAawB0AG8AcABTAGUAdAB1AHAAXwB4ADYANAAuAGUAeABlACIAIAAtAFIAZQBjAHUAcgBzAGUACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAkAFAAQgBJAFMAZQB0AHUAcAAgAD0AIAAkAGUAbgB2ADoAUwB5AHMAdABlAG0ARAByAGkAdgBlACAAKwAgACQAUABCAEkARgBvAGwAZABlAHIALgBQAFMAUABhAHIAZQBuAHQAUABhAHQAaAAuAFMAcABsAGkAdAAoACcAOgAnACkAWwAzAF0AIAArACAAIgBcAFAAQgBJAEQAZQBzAGsAdABvAHAAUwBlAHQAdQBwAF8AeAA2ADQALgBlAHgAZQAiAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAUwB0AGEAcgB0AC0AUAByAG8AYwBlAHMAcwAgACQAUABCAEkAUwBlAHQAdQBwACAAJwAvAHUAbgBpAG4AcwB0AGEAbABsACAALwBxAHUAaQBlAHQAJwAgAC0AVwBhAGkAdAAKAA=="
从那里,您可以进行 Powershell 调用,但您可以使用 -EncodedCommand
.
而不是 -Command
参数
powershell.exe -noprofile -noninteractive -EncodedCommand "CgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAkAFAAQgBJAEYAbwBsAGQAZQByACAAPQAgAEcAZQB0AC0AQwBoAGkAbABkAEkAdABlAG0AIAAtAFAAYQB0AGgAIAAiACQAZQBuAHYAOgBBAGwAbABVAHMAZQByAHMAUAByAG8AZgBpAGwAZQBcAFAAYQBjAGsAYQBnAGUAIABDAGEAYwBoAGUAXAAiACAALQBGAGkAbAB0AGUAcgAgACIAUABCAEkARABlAHMAawB0AG8AcABTAGUAdAB1AHAAXwB4ADYANAAuAGUAeABlACIAIAAtAFIAZQBjAHUAcgBzAGUACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAkAFAAQgBJAFMAZQB0AHUAcAAgAD0AIAAkAGUAbgB2ADoAUwB5AHMAdABlAG0ARAByAGkAdgBlACAAKwAgACQAUABCAEkARgBvAGwAZABlAHIALgBQAFMAUABhAHIAZQBuAHQAUABhAHQAaAAuAFMAcABsAGkAdAAoACcAOgAnACkAWwAzAF0AIAArACAAIgBcAFAAQgBJAEQAZQBzAGsAdABvAHAAUwBlAHQAdQBwAF8AeAA2ADQALgBlAHgAZQAiAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAUwB0AGEAcgB0AC0AUAByAG8AYwBlAHMAcwAgACQAUABCAEkAUwBlAHQAdQBwACAAJwAvAHUAbgBpAG4AcwB0AGEAbABsACAALwBxAHUAaQBlAHQAJwAgAC0AVwBhAGkAdAAKAA=="
如果你需要解码命令来编辑它,你可以做这样的事情(见下文),然后 re-encode 修改后的脚本并更新你的编码命令。
# $EncodedCommand need to be set to your base 64 string to be decoded.
$EncodedCommand = 'SABlAGwAbABvACAAVwBvAHIAbABkAA==' # Encoded "Hello World"
[System.Text.Encoding]::Unicode.GetString([System.Convert]::FromBase64String($EncodedCommand))
优点是您不会失去可读性,因为您的可编辑版本保留在多行上。您还可以避免更复杂脚本的任何解析问题。
使用 -EncodedCommand
开关 - 它接受 command/script 作为 base64 字符串,非常适合将单个脚本存储为命令行参数:
powershell.exe -EncodedCommand <base64-encoded-script>
要对脚本进行编码:
# assign code to a variable
# in real life you would read this from the file with `Get-Content path\to\script.ps1 -Raw`
$rawCode = @'
$PBIFolder = Get-ChildItem -Path "$env:AllUsersProfile\Package Cache\" -Filter "PBIDesktopSetup_x64.exe" -Recurse
$PBISetup = $env:SystemDrive+$PBIFolder.PSParentPath.Split(':')[3]+"\PBIDesktopSetup_x64.exe"
Start-Process $PBISetup '/uninstall /quiet' -Wait
'@
# UTF16LE-encode the script
$utf16EncodedScript = [System.Text.Encoding]::Unicode.GetBytes($rawCode)
# Base64-encode the resulting byte string
[System.Convert]::ToBase64String($utf16EncodedScript)
生成的命令行变为:
powershell.exe -EncodedCommand JABQAEIASQBGAG8AbABkAGUAcgAgAD0AIABHAGUAdAAtAEMAaABpAGwAZABJAHQAZQBtACAALQBQAGEAdABoACAAIgAkAGUAbgB2ADoAQQBsAGwAVQBzAGUAcgBzAFAAcgBvAGYAaQBsAGUAXABQAGEAYwBrAGEAZwBlACAAQwBhAGMAaABlAFwAIgAgAC0ARgBpAGwAdABlAHIAIAAiAFAAQgBJAEQAZQBzAGsAdABvAHAAUwBlAHQAdQBwAF8AeAA2ADQALgBlAHgAZQAiACAALQBSAGUAYwB1AHIAcwBlAAoAJABQAEIASQBTAGUAdAB1AHAAIAA9ACAAJABlAG4AdgA6AFMAeQBzAHQAZQBtAEQAcgBpAHYAZQArACQAUABCAEkARgBvAGwAZABlAHIALgBQAFMAUABhAHIAZQBuAHQAUABhAHQAaAAuAFMAcABsAGkAdAAoACcAOgAnACkAWwAzAF0AKwAiAFwAUABCAEkARABlAHMAawB0AG8AcABTAGUAdAB1AHAAXwB4ADYANAAuAGUAeABlACIACgBTAHQAYQByAHQALQBQAHIAbwBjAGUAcwBzACAAJABQAEIASQBTAGUAdAB1AHAAIAAnAC8AdQBuAGkAbgBzAHQAYQBsAGwAIAAvAHEAdQBpAGUAdAAnACAALQBXAGEAaQB0AA==
我试图将下面的命令转换为单行,但无济于事。我试过放更多的 apsas、大括号、方括号,但什么也没有。
$PBIFolder = Get-ChildItem -Path "$env:AllUsersProfile\Package Cache\" -Filter "PBIDesktopSetup_x64.exe" -Recurse
$PBISetup = $env:SystemDrive+$PBIFolder.PSParentPath.Split(':')[3]+"\PBIDesktopSetup_x64.exe"
Start-Process $PBISetup '/uninstall /quiet' -Wait
我试过这种方法,但没有成功
powershell.exe -noprofile -noninteractive -command ($PBIFolder = Get-ChildItem -Path "$env:AllUsersProfile\Package Cache\" -Filter "PBIDesktopSetup_x64.exe" -Recurse; $PBISetup = $env:SystemDrive+$PBIFolder.PSParentPath.Split(':')[3]+"\PBIDesktopSetup_x64.exe"; Start-Process $PBISetup -Parameters '/uninstall /quiet' -Wait)
尝试:
powershell.exe '-noprofile -noninteractive -command &($PBIFolder = Get-ChildItem -Path "$env:AllUsersProfile\Package Cache\" -Filter "PBIDesktopSetup_x64.exe" -Recurse; $PBISetup = $env:SystemDrive+$PBIFolder.PSParentPath.Split(':')[3]+"\PBIDesktopSetup_x64.exe"; Start-Process $PBISetup -Parameters '/uninstall /quiet' -Wait)'
当我有较长的脚本需要在不依赖外部脚本文件的情况下内联执行时,我喜欢使用另一种方法。
我没有尝试将所有内容放在一行中,而是使用 Powershell.exe
的 -EncodedCommand
参数。这样,就不会出现任何问题,因为编码命令是脚本的 Base 64 字符串表示形式。
要获得正确的调用,您需要先将脚本转换为 Base64 字符串。看看我是如何包装你的脚本的。
[System.Convert]::ToBase64String(
[System.Text.Encoding]::Unicode.GetBytes({
$PBIFolder = Get-ChildItem -Path "$env:AllUsersProfile\Package Cache\" -Filter "PBIDesktopSetup_x64.exe" -Recurse
$PBISetup = $env:SystemDrive + $PBIFolder.PSParentPath.Split(':')[3] + "\PBIDesktopSetup_x64.exe"
Start-Process $PBISetup '/uninstall /quiet' -Wait
}))
我们从中得到的字符串是:
"CgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAkAFAAQgBJAEYAbwBsAGQAZQByACAAPQAgAEcAZQB0AC0AQwBoAGkAbABkAEkAdABlAG0AIAAtAFAAYQB0AGgAIAAiACQAZQBuAHYAOgBBAGwAbABVAHMAZQByAHMAUAByAG8AZgBpAGwAZQBcAFAAYQBjAGsAYQBnAGUAIABDAGEAYwBoAGUAXAAiACAALQBGAGkAbAB0AGUAcgAgACIAUABCAEkARABlAHMAawB0AG8AcABTAGUAdAB1AHAAXwB4ADYANAAuAGUAeABlACIAIAAtAFIAZQBjAHUAcgBzAGUACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAkAFAAQgBJAFMAZQB0AHUAcAAgAD0AIAAkAGUAbgB2ADoAUwB5AHMAdABlAG0ARAByAGkAdgBlACAAKwAgACQAUABCAEkARgBvAGwAZABlAHIALgBQAFMAUABhAHIAZQBuAHQAUABhAHQAaAAuAFMAcABsAGkAdAAoACcAOgAnACkAWwAzAF0AIAArACAAIgBcAFAAQgBJAEQAZQBzAGsAdABvAHAAUwBlAHQAdQBwAF8AeAA2ADQALgBlAHgAZQAiAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAUwB0AGEAcgB0AC0AUAByAG8AYwBlAHMAcwAgACQAUABCAEkAUwBlAHQAdQBwACAAJwAvAHUAbgBpAG4AcwB0AGEAbABsACAALwBxAHUAaQBlAHQAJwAgAC0AVwBhAGkAdAAKAA=="
从那里,您可以进行 Powershell 调用,但您可以使用 -EncodedCommand
.
-Command
参数
powershell.exe -noprofile -noninteractive -EncodedCommand "CgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAkAFAAQgBJAEYAbwBsAGQAZQByACAAPQAgAEcAZQB0AC0AQwBoAGkAbABkAEkAdABlAG0AIAAtAFAAYQB0AGgAIAAiACQAZQBuAHYAOgBBAGwAbABVAHMAZQByAHMAUAByAG8AZgBpAGwAZQBcAFAAYQBjAGsAYQBnAGUAIABDAGEAYwBoAGUAXAAiACAALQBGAGkAbAB0AGUAcgAgACIAUABCAEkARABlAHMAawB0AG8AcABTAGUAdAB1AHAAXwB4ADYANAAuAGUAeABlACIAIAAtAFIAZQBjAHUAcgBzAGUACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAkAFAAQgBJAFMAZQB0AHUAcAAgAD0AIAAkAGUAbgB2ADoAUwB5AHMAdABlAG0ARAByAGkAdgBlACAAKwAgACQAUABCAEkARgBvAGwAZABlAHIALgBQAFMAUABhAHIAZQBuAHQAUABhAHQAaAAuAFMAcABsAGkAdAAoACcAOgAnACkAWwAzAF0AIAArACAAIgBcAFAAQgBJAEQAZQBzAGsAdABvAHAAUwBlAHQAdQBwAF8AeAA2ADQALgBlAHgAZQAiAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAUwB0AGEAcgB0AC0AUAByAG8AYwBlAHMAcwAgACQAUABCAEkAUwBlAHQAdQBwACAAJwAvAHUAbgBpAG4AcwB0AGEAbABsACAALwBxAHUAaQBlAHQAJwAgAC0AVwBhAGkAdAAKAA=="
如果你需要解码命令来编辑它,你可以做这样的事情(见下文),然后 re-encode 修改后的脚本并更新你的编码命令。
# $EncodedCommand need to be set to your base 64 string to be decoded.
$EncodedCommand = 'SABlAGwAbABvACAAVwBvAHIAbABkAA==' # Encoded "Hello World"
[System.Text.Encoding]::Unicode.GetString([System.Convert]::FromBase64String($EncodedCommand))
优点是您不会失去可读性,因为您的可编辑版本保留在多行上。您还可以避免更复杂脚本的任何解析问题。
使用 -EncodedCommand
开关 - 它接受 command/script 作为 base64 字符串,非常适合将单个脚本存储为命令行参数:
powershell.exe -EncodedCommand <base64-encoded-script>
要对脚本进行编码:
# assign code to a variable
# in real life you would read this from the file with `Get-Content path\to\script.ps1 -Raw`
$rawCode = @'
$PBIFolder = Get-ChildItem -Path "$env:AllUsersProfile\Package Cache\" -Filter "PBIDesktopSetup_x64.exe" -Recurse
$PBISetup = $env:SystemDrive+$PBIFolder.PSParentPath.Split(':')[3]+"\PBIDesktopSetup_x64.exe"
Start-Process $PBISetup '/uninstall /quiet' -Wait
'@
# UTF16LE-encode the script
$utf16EncodedScript = [System.Text.Encoding]::Unicode.GetBytes($rawCode)
# Base64-encode the resulting byte string
[System.Convert]::ToBase64String($utf16EncodedScript)
生成的命令行变为:
powershell.exe -EncodedCommand JABQAEIASQBGAG8AbABkAGUAcgAgAD0AIABHAGUAdAAtAEMAaABpAGwAZABJAHQAZQBtACAALQBQAGEAdABoACAAIgAkAGUAbgB2ADoAQQBsAGwAVQBzAGUAcgBzAFAAcgBvAGYAaQBsAGUAXABQAGEAYwBrAGEAZwBlACAAQwBhAGMAaABlAFwAIgAgAC0ARgBpAGwAdABlAHIAIAAiAFAAQgBJAEQAZQBzAGsAdABvAHAAUwBlAHQAdQBwAF8AeAA2ADQALgBlAHgAZQAiACAALQBSAGUAYwB1AHIAcwBlAAoAJABQAEIASQBTAGUAdAB1AHAAIAA9ACAAJABlAG4AdgA6AFMAeQBzAHQAZQBtAEQAcgBpAHYAZQArACQAUABCAEkARgBvAGwAZABlAHIALgBQAFMAUABhAHIAZQBuAHQAUABhAHQAaAAuAFMAcABsAGkAdAAoACcAOgAnACkAWwAzAF0AKwAiAFwAUABCAEkARABlAHMAawB0AG8AcABTAGUAdAB1AHAAXwB4ADYANAAuAGUAeABlACIACgBTAHQAYQByAHQALQBQAHIAbwBjAGUAcwBzACAAJABQAEIASQBTAGUAdAB1AHAAIAAnAC8AdQBuAGkAbgBzAHQAYQBsAGwAIAAvAHEAdQBpAGUAdAAnACAALQBXAGEAaQB0AA==