主要问题

主要问题

我正在努力解决一个显然很简单但似乎不那么容易解决的问题。我要运行一系列动态的 powershell 命令。这是我为自己编写的一些模板的一部分,目的是让我的工作流程更轻松。

以下是生成的分组命令的简单示例:

$commands = {
  Write-Output "Navigating to tools->deploy";
  Set-Location "C:\tools\deploy\";
  Write-Output "OK. Run dd.ps1 [server name] to deploy.";
}

可以$commands使用 来运行它Invoke-Command。所以最终我有这个函数来处理它:

function invokeNow() {
  param([string]$c)
  Invoke-Command $c;
} 

这很好用。它在窗口中执行对象中的命令。但随着时间的推移,我为其添加了更多功能。对于每个新指令,我每次都必须打开 powershell... 这是因为有时,当脚本运行时,我无法发出另一个函数。所以,我现在的目标是在新的窗口,这样我就可以使用同一个 shell 窗口来调用多个任务(在各自的窗口中运行)。我认为这很简单,所以我将函数改为

function invokeNow() {
  param([string]$c)
  Invoke-Expression "cmd /c start powershell -Command {$c} -NoProfile -NoExit";
} 

这导致了这样的结果:

#< CLIXML
#< CLIXML
PS C:\tools\deploy\>

导航确实有效。但是,我的输出信息丢失了。一些命令添加了指令,例如deploy S1 foodeploy FS -src "data"。这些指令有时很难记住。为此,我有两个小问题:(1)我的Write-Output数据在哪里?(2)那个奇怪的东西是什么CLIXML(根据谷歌,它似乎是“特殊的”powershell XML)?当我发出exit关闭该窗口的命令时,在窗口关闭之前,我看到了一堆 XML 内容。

主要问题

是否可以打开一个新的 powershell 窗口,然后正确执行我的对象中的命令$commands(从而包括Write-Output数据)?

我已经尝试过添加Invoke-Command上述内容

Invoke-Expression "cmd /c start powershell -Command {Invoke-Command -ScriptBlock $c} -NoProfile -NoExit";

但是新窗口吐出了很多 XML 内容……

ps 疯狂


版本信息

PS C:\> $PSVersionTable
Name                           Value
----                           -----
PSVersion                      5.1.16299.251
PSEdition                      Desktop
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   10.0.16299.251
CLRVersion                     4.0.30319.42000
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1

相关内容