簡體   English   中英

將 powershell 腳本放入帶雙引號的變量中的正確語法

[英]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.

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