簡體   English   中英

如何在C#中的PowerShell.AddParameter方法中使用powershell變量?

[英]How to use powershell variable in PowerShell.AddParameter method in C#?

請參閱下面的代碼。 該腳本創建變量$ backupFile。 如何在下一個語句中將該變量用作New-Item表達式的path參數的值?

        using (var ps = PowerShell.Create())
        {
            ps.RunspacePool = _runspacePool;
            ps.AddScript("$backupFile = [System.IO.Path]::Combine([System.IO.Path]::GetTempPath(),'{0}.bak')".FormatInvariant(databaseName));
            ps.AddStatement();
            ps.AddCommand("New-Item")
                .AddParameter("Force")
                .AddParameter("ItemType", "File")
                .AddParameter("Path", /* How to use $backupFile?? */));
            ps.Invoke();
        }

在調用第一個腳本之前,該變量將不可用。 嘗試這個:

ps.AddScript("$backupFile = [System.IO.Path]::Combine([System.IO.Path]::GetTempPath(),'{0}.bak')".FormatInvariant(databaseName));
ps.Invoke();
ps.Commands.Clear();
var backupFile = ps.Runspace.SessionStateProxy.PSVariable.Get("backupFile");
ps.AddCommand("New-Item")
  .AddParameter("Force")
  .AddParameter("ItemType", "File")
  .AddParameter("Path", backupFile ));
ps.Invoke();

如果你走這條路線,我認為你不能使用RunspacePool,因為你可能會在每個Invoke()之間獲得不同的運行空間。 在這種情況下,該變量將不可用於其他運行空間。 在這種情況下,您真的需要使用RunspacePool嗎? 如果你這樣做,為什么不在C#中做第一位:

var backupFile = Path.Combine(Path.GetTempPath(), databaseName +'.bak');

我會嘗試使用不同的Invoke。 如果使用PowerShell.Invoke方法(PSDataCollection,PSDataCollection,PSInvocationSettings),則可以從管道末尾刪除所需信息,並在腳本的其余部分使用PSDataCollection<T> Output中的值。

雖然Keith和Eris的答案很有幫助,但我認為對於其他讀這篇文章的人來說,更有幫助的是,到目前為止我的結論是用自己的答案來構建自己的答案。

我最初的問題的答案似乎是不可能的(至少到目前為止我們找不到辦法)。

因此,似乎AddCommand(使用AddArgument,AddParameter(s))的用例是使用一個或多個命令組成一個管道,然后將結果作為Invoke方法的輸出。 最終,您可以添加其他管道(由AddStatement分隔),只要它們不相互依賴。 您將在Invoke方法的輸出集合中獲得多個結果。

當你想要執行2個管道而第二個取決於第一個管道的結果時(並且不可能管道結果(如我的代碼示例中所示),我認為有兩個選項:1)第一個管道的Call Invoke並在編寫第二個管道時使用輸出。 或者2)編寫一個腳本(例如使用StringBuilder)並使用一個Invoke執行該腳本。

當您使用遠程連接時,后一個選項可能更可取,因為這只是對遠程服務器的一次調用。

暫無
暫無

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

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