使用的Powershell版本:3.0
大家好,
我正在尝试创建一个新的Powershell管道并在其中执行一个脚本,然后将它产生的输出转换为输出变量,但是我无法从对象中获取任何输出(来自执行脚本)。这一切的重点是,我不必管理$ Error对象,我打算用它来进行错误检测。以下是一个例子:
$ps = [Powershell]::Create()
$File = ".\Test2.ps1"
$SortedParams = "-Name blah -Key foo"
$RootDirectory = Get-Location
$ExecutionDirectory = "$RootDirectory\Test3"
$ps.AddCommand("Set-Location").AddParameter("Path", "$ExecutionDirectory")
write-host "COMMAND 1: " $ps.Commands.Commands.Item(0).CommandText
$ps.AddScript("$File $SortedParams")
write-host "COMMAND 2: " $ps.Commands.Commands.Item(1).CommandText
$output = $ps.Invoke()
write-host $output
我应该提一下,我正在尝试使用以下3种方法在执行的脚本中产生输出:
非常感谢您提出的任何建议或提示!
答案 0 :(得分:2)
除非您觉得特定需要按照您的方式执行操作,否则您可能需要考虑使用PowerShell后台作业。
后台作业允许您在单独的PowerShell实例中运行PowerShell命令,然后将这些作业的输出收集到变量中(如果这是您想要的)。
查看about_Jobs帮助主题以获取更多信息。
这是一个简单的例子:
$job = Start-Job -ScriptBlock { "Hello World!" }
$ret = Receive-Job $job -Wait -AutoRemoveJob
# value of $ret will be "Hello World!"
答案 1 :(得分:0)
您可以使用Invoke-Expression cmdlet调用另一个脚本,并使用-OutVariable参数捕获其输出。我建议使用Out-Null,以便数据不会填充到控制台两次,随时删除该管道命令。这是一个例子:
Invoke-Expression -Command "c:\EventLog.ps1" -OutVariable $data | Out-Null
Write-Host $data
这是我在上例中使用的示例脚本中的代码:
Param($ComputerName = ".")
Get-EventLog -ComputerName $ComputerName -Log application -EntryType Error |
Group-Object -Property source |
Sort-Object -Property Count -Descending |
Format-Table Count, Name -AutoSize
答案 2 :(得分:0)
检查错误流是否有错误:
$ps.Streams.Error
这对我有用:
$ps = [Powershell]::Create()
cd 'C:\Users\Andy\Documents'
$File = ".\Test2.ps1"
$SortedParams = "-Name blah -Key foo"
$RootDirectory = Get-Location
$ExecutionDirectory = "$RootDirectory\Test3"
$ps.AddCommand("Set-Location").AddParameter("Path", "$ExecutionDirectory") | Out-Null
$ps.AddScript("$File $SortedParams") | Out-Null
$output = $ps.Invoke()
write-host $output
这显示了我的设置:
显示文件组织:
Command:
tree.com /F /A $ExecutionDirectory
Output:
C:\USERS\ANDY\DOCUMENTS\TEST3
Test2.ps1
显示脚本内容:
Command:
cat "$ExecutionDirectory\Test2.ps1"
Output:
param (
$Name,
$Key
)
$Name
$Key
答案 3 :(得分:0)
我使用Invoke-Expression,这是唯一适用于我的解决方案:
test2.ps
Invoke-Expression .\test1.ps1 | Tee-Object -Variable msg | Out-Null
write-host "Return: $msg"</code>
和test1.ps:
$hola="Testing"
$hola
呼叫:
C:\Test>powershell -ExecutionPolicy unrestricted -file test2.ps1
Return: Testing