[英]correct syntax for putting a powershell script into a variable with double quotes
我需要像這樣將 PowerShell 腳本放入帶有雙引號的變量中。 但是我不知道正確的語法,因為我在嘗試此操作時看到 $script 變量的語法錯誤。
$script = "Invoke-Command -ComputerName $hostname -Credential $cred -ScriptBlock {Import-Module sqlserver; invoke-sqlcmd -ServerInstance $Using:hostname\MSSQLServer; invoke-sqlcmd "create login [$Using:sqluser] from windows";invoke-sqlcmd "alter server role sysadmin add member [$Using:sqluser]"}"
$runscript = Invoke-VMScript -VM $vm -ScriptText $script -GuestUser $tmpl_user -GuestPassword $tmpl_pass -ToolsWaitSecs 300
Invoke-VMScript -ScriptText
僅接受包含 PowerShell 代碼的字符串,並且不支持單獨將arguments傳遞給該代碼。
其含義是:
為了包含來自調用者的 scope 的變量值,您確實需要使用字符串插值(通過可擴展字符串, "..."
),正如您所嘗試的那樣。
"... -Foo '$foo'..."
) 正如Mathias R. Jessen指出的那樣,您想要在目標機器上評估的變量引用必須將其$
sigil 轉義為`$
以防止調用方過早插值; 例如`$Using:sqluser
但是,有一個問題:
字符串插值的使用對可以嵌入到字符串中的數據類型施加了限制,因為並非所有數據類型都具有被識別為原始類型的字符串文字表示。
在您的情況下,調用方$cred
變量包含一個[PSCredential]
實例,它沒有有意義地進行字符串化(並且出於安全原因不能):它毫無意義地擴展為System.Management.Automation.PSCredential
的逐字字符串值,即實例的類型名稱。
換句話說:您不能以這種方式傳遞憑據。
一個潛在的解決方法需要在目標機器上進行前期工作:您可以嘗試將憑據以加密形式保存到文件中,然后在調用時通過Import-Clixml
反序列化該文件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.