2017-08-28 61 views
1

我想運行以下命令在新的powershell實例中執行一些命令。如何在調用另一個PowerShell實例時擴展變量?

start powershell {java -jar x.jar -url $URL/computer/$name/ -secret $secret; Read-Host} 

我有$URL$name$secret傳遞作爲輸入參數和I可以重複它們的值沒有問題。

的問題是,當新的PowerShell實例啓動時,它只能看到

java -jar x.jar -url /computer// -secret

(即變量值尚未通過。) 我該如何解決這個問題?

完整的示例腳本:

param(
[parameter(Mandatory=$TRUE,Position=0)] 
    [string] $URL, 
[parameter(Mandatory=$TRUE,Position=1)] 
    [string] $name, 
[parameter(Mandatory=$TRUE,Position=2)] 
    [string] $secret 
) 

echo $URL 
echo $name 
echo $secret 

start powershell {java -jar x.jar -url $URL/computer/$name/ -secret $secret; Read-Host} 

回答

1

通過{}您創建一個代碼塊括號包圍你的代碼。 Powershell解釋器不會在代碼塊內擴展任何內容。嘗試在PowerShell命令行中輸入{ java $dummy }並點擊返回。來自(未執行)代碼塊的返回值是其未擴展內容。

通常情況下,一個代碼塊繼承了外部變量的值,所以如果你在調用上下文中執行代碼塊,變量值將是可見的,並且可以使用。

既然你在一個新的PowerShell進程啓動它然而,變量沒有設置,返回空($null)值。

因此,您需要在前往start命令的途中展開變量,並在java.exe執行的途中保留展開變量中的所有空格。下面的轉義應該爲你做的伎倆:

start powershell "java -jar x.jar -url '$URL/computer/$name/' -secret '$secret'; Read-Host" 

爲了安全起見這些問題,你可以使用EncodedCommand參數使用PowerShell,就像這樣:

$command = "java -jar x.jar -url '$URL/computer/$name/' -secret '$secret'; Read-Host" # Variables get expanded here 
$bytes = [System.Text.Encoding]::Unicode.GetBytes($command) 
$encodedCommand = [Convert]::ToBase64String($bytes) 
start powershell "-EncodedCommand $encodedCommand" 
# Or, with full parameters: 
# Start-Process -FilePath powershell -ArgumentList "-EncodedCommand $encodedCommand" 
相關問題