簡體   English   中英

將參數傳遞給 powershell 編碼的命令

[英]Pass parameter to powershell encoded command

我有一個有很多行的腳本。 我可以輕松地將此腳本粘貼到 scriptblock 參數中,而無需對其進行編輯(例如,在腳本中的引號前放置反斜杠)。 然后我可以對腳本進行編碼,以便它可以作為 en 編碼參數傳遞給 powershell:

$myscript = {
#paste of simplified script
$calc = 6 + 9
echo $calc
}

# Convert script to a string
$command = $carvingScript.ToString()
# Convert string to base64 encoded command
$bytes = [System.Text.Encoding]::Unicode.GetBytes( $command )
$encodedCommand = [Convert]::ToBase64String( $bytes )

我希望能夠在進行 base64 轉換的腳本中傳遞一個參數。 像這樣:

$parameter = 9
$myscript = {
$calc = 6 + $parameter
echo $calc
}

任何想法如何解決這個問題? 我知道 scriptblock 可以包含參數,但為了解析參數需要解析整個腳本,而不僅僅是一個參數

如何將變量添加到腳本塊的直接答案是:

$parameter = 9

$myscript = @'
$calc = 6 + {0}
echo $calc
'@ -f $parameter

$scriptblock = [scriptblock]::Create($myscript)

基本上將其構建為字符串並使用[scriptblock]的 create 方法進行轉換。

但是您可以跳過創建腳本塊,因為之后您只需將其直接轉換回字符串。

這是一篇舊帖子,但我發現這篇文章對我有用,所以我想與親愛的社區分享它:)

您可以在腳本塊中使用帶有強制參數的param塊:

$myscript = {
    param
    (
        [Parameter(Mandatory)]
        [decimal]
        $First,

        [Parameter(Mandatory)]
        [decimal]
        $Second
    )
    [decimal]($First + $Second)
}

$bytes = [System.Text.Encoding]::Unicode.GetBytes($myscript)
$encodedCommand = [Convert]::ToBase64String($bytes)
$encodedCommand | Set-Content 'C:\temp\encodedCommand.txt' -Encoding UTF8

然后通過管道在兩個powershell.exe調用之間傳遞參數:

powershell.exe -noprofile -command "3.3, 2.7" | powershell.exe -encodedcommand DQAKACAAIAAgACAAcABhAHIAYQBtAA0ACgAgACAAIAAgACgADQAKACAAIAAgACAAIAAgACAAIABbAFAAYQByAGEAbQBlAHQAZQByACgATQBhAG4AZABhAHQAbwByAHkAKQBdAA0ACgAgACAAIAAgACAAIAAgACAAWwBkAGUAYwBpAG0AYQBsAF0ADQAKACAAIAAgACAAIAAgACAAIAAkAEYAaQByAHMAdAAsAA0ACgANAAoAIAAgACAAIAAgACAAIAAgAFsAUABhAHIAYQBtAGUAdABlAHIAKABNAGEAbgBkAGEAdABvAHIAeQApAF0ADQAKACAAIAAgACAAIAAgACAAIABbAGQAZQBjAGkAbQBhAGwAXQANAAoAIAAgACAAIAAgACAAIAAgACQAUwBlAGMAbwBuAGQADQAKACAAIAAgACAAKQANAAoAIAAgACAAIABbAGQAZQBjAGkAbQBhAGwAXQAoACQARgBpAHIAcwB0ACAAKwAgACQAUwBlAGMAbwBuAGQAKQANAAoA

這是使用 Powershell 交互式輸入模式,該模式在整個輸出中可見,因此請注意您是否傳遞了任何密碼或機密:

cmdlet  at command pipeline position 1
Supply values for the following parameters:
First: 3.3
Second: 2.7
6.0

如果您曾經嘗試使用列表(數組)參數並將值列表傳遞給編碼命令,那么您需要記住最后一個數組元素必須是空字符串 - 這就是您如何欺騙交互式輸入模式來設置列表參數。

$command = {
    param
    (
        [Parameter(Mandatory)]
        [string[]]
        $MyList
    )
    $MyList | ForEach-Object { Write-Host $_ }
}

$bytes = [System.Text.Encoding]::Unicode.GetBytes($command)
$encodedCommand = [Convert]::ToBase64String($bytes)
"powershell.exe -noprofile -command `"'test1', 'test2', 'test3', ''`" | powershell.exe -encodedcommand $encodedCommand" | Set-Content 'C:\temp\test.txt' -Encoding UTF8
PS C:\temp> powershell.exe -noprofile -command "'test1', 'test2', 'test3', ''" | powershell.exe -encodedcommand DQAKACAAIAAgACAAcABhAHIAYQBtAA0ACgAgACAAIAAgACgADQAKACAAIAAgACAAIAAgACAAIABbAFAAYQByAGEAbQBlAHQAZQByACgATQBhAG4AZABhAHQAbwByAHkAKQBdAA0ACgAgACAAIAAgACAAIAAgACAAWwBzAHQAcgBpAG4AZwBbAF0AXQANAAoAIAAgACAAIAAgACAAIAAgACQATQB5AEwAaQBzAHQADQAKACAAIAAgACAAKQANAAoAIAAgACAAIAAkAE0AeQBMAGkAcwB0ACAAfAAgAEYAbwByAEUAYQBjAGgALQBPAGIAagBlAGMAdAAgAHsAIABXAHIAaQB0AGUALQBIAG8AcwB0ACAAJABfACAAfQANAAoA


cmdlet  at command pipeline position 1
Supply values for the following parameters:
MyList[0]: test1
MyList[1]: test2
MyList[2]: test3
MyList[3]:
test1
test2
test3

我希望它會在將來對某人有所幫助。 和平!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM