使用powershell对象来执行脚本

时间:2013-08-16 18:16:17

标签: powershell powershell-v3.0 jobs start-job

使用的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种方法在执行的脚本中产生输出:

  • 写主机
  • 写输出
  • Write-Verbose(使用$ ps.Streams.Verbose尝试获取输出,但没有)

非常感谢您提出的任何建议或提示!

4 个答案:

答案 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