将子进程的输出重定向到父进程 - Powershell

时间:2012-07-04 06:58:07

标签: powershell

我有powershell进程,我正在调用Start-Process或System.Diagnostic.Process来启动子进程作为不同的用户(以获取其他用户环境变量)

我尝试使用redirectoutput但它不起作用。以下是代码

    $process = New-Object System.Diagnostics.Process
    $startinfo = New-Object "System.Diagnostics.ProcessStartInfo"

    $startinfo.FileName = "powershell"
    $startinfo.UserName = $user
    $startinfo.Password = $pass
    $startinfo.Arguments = $arguments        
    $startinfo.UseShellExecute = $False
    $startinfo.RedirectStandardInput = $True

    $process.StartInfo = $startinfo
    $process.Start() | Out-Null
    $process.WaitForExist()
    $output = $process.StandardOutput.ReadToEnd()        

此外,我正在尝试以最小化或隐藏方式运行此过程,但它不起作用。

任何帮助都将非常感激 问候 Ajax的

1 个答案:

答案 0 :(得分:3)

这是一个能够做你想做的事情的功能:

function Invoke-PSCommandAsUser
{
    param(
        [System.Management.Automation.PSCredential]$cred, 
        [System.String]$command
    );

    $psi = New-Object System.Diagnostics.ProcessStartInfo

    $psi.RedirectStandardError = $True
    $psi.RedirectStandardOutput = $True

    $psi.UseShellExecute = $False
    $psi.UserName = $cred.UserName
    $psi.Password = $cred.Password

    $psi.FileName = (Get-Command Powershell).Definition
    $psi.Arguments = "-Command $command"

    $p = [Diagnostics.Process]::Start($psi)
    $p.WaitForExit()

    Write-Output $p.StandardOutput.ReadToEnd()
}

根据MSDN,如果使用Process.Start作为机制,则无法运行此隐藏

  

如果StartInfo实例的UserName和Password属性是   set,调用非托管的CreateProcessWithLogonW函数   即使CreateNoWindow属性,也在新窗口中启动该过程   value为true或WindowStyle属性值为Hidden。    - source