我正在努力解决一个显然很简单但似乎不那么容易解决的问题。我要运行一系列动态的 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 foo
或deploy 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 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