使用参数和凭据从PowerShell启动.ps1脚本并从中获取输出

时间:2020-03-27 12:10:49

标签: powershell runas start-process

我认为我的问题有一个简单的解决方案。但是现在我有点困惑。 我有Java代码,该代码开始1个Powershell脚本。此Powershell脚本必须启动其他脚本。
Java->
Powershell.ps1->
Script1.ps1 Script2.ps1 Script3.ps1 脚本...

Script1,2,.. etc执行多个任务并返回字符串值。

我尝试过 启动过程,调用命令和调用表达

假设script1.ps1为:

$a = 1+2
$a

Start-Process对我来说是最好的,但是我没有得到输出:

$arguments = "C:\..\script1.ps1" + " -ClientName" + $DeviceName
$output = Start-Process powershell -ArgumentList $arguments -Credential $credentials
$output 

$ output ist NULL。

非常感谢您!

1 个答案:

答案 0 :(得分:1)

Start-Process默认情况下不产生 输出。

(使它直接产生输出 的唯一方法是使用-PassThru,然后它不返回 script的输出,而是返回{{ 1}}实例代表新创建的过程-参见下文。)

通过System.Diagnostics.Process从脚本中捕获脚本输出的唯一方法是使用Start-Process
-RedirectStandardOutput个参数以文件形式捕获脚本的输出为文本 [1]

在新过程完成后,您可以在PowerShell 中读取这些文件,您可以通过以下两种方式之一来确保这一点:

  • 还将-RedirectStandardError开关传递到-Wait,以使调用同步,这意味着当Start-Process返回时,输出已被捕获到指定的文件中( s ..

  • 使用Start-Process获得一个System.Diagnostics.Process实例,然后将其传递给Wait-Process(或直接使用其-PassThru方法;属性.WaitForExit()可以用于检查进程是否仍在运行。

以下是您可能遇到的情况:

.HasExited

很遗憾,PowerShell CLI通过标准输出(请参阅6 output streams)报告了PowerShell this answer的所有全部,因此上述内容捕获了< em> all 从脚本输出,包括错误输出。

但是,您可以使用$arguments = "-File C:\...\script1.ps1" + " -ClientName" + $DeviceName # Launch the script in a new window running as the given user, # capture its standard output in file ./out.txt, # and wait for it to finish. Start-Process -Wait -RedirectStandardOutput ./out.txt powershell -ArgumentList $arguments -Credential $credentials "Running script1.ps1 produced the following output:" Get-Content ./out.txt 来分别捕获错误流。


[1] 通过其CLI调用另一个PowerShell实例提供了一种用于捕获非结构化文本的结构化替代方法(以下为显示输出,就像打印到控制台一样(默认情况下会发生这种情况):

-RedirectStandardError ./err.txt (或-OutputFormat xml / -of xml)使PowerShell格式的输出为CLIXML格式,这与PowerShell中使用的基于XML的序列化格式相同序列化丰富对象 的远程处理和后台作业,您可以在以后的Import-Clixml调用中“补水”

注意:对于大多数复杂对象,会出现类型保真度的损失 :也就是说,它们被序列化为原始对象的 emulations ;简而言之就是没有方法的“财产袋”,但这可能就足够了-参见this answer

这是一个使用-o xml实例的快速演示,该实例确实使用保真类型反序列化:

[datetime]