我认为我的问题有一个简单的解决方案。但是现在我有点困惑。
我有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。
非常感谢您!
答案 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]