如何从PowerShell函数中获取.NET StandardOutput和StandardError

时间:2019-04-09 12:38:58

标签: .net powershell error-handling output

我正在尝试使用https://www.itdroplets.com/run-a-command-as-a-different-user-in-powershell/作为指导,为不接受-credential参数的PowerShell cmdlet创建包装函数。问题是我无法获得有关这些cmdlet的成功或失败的有意义的输出。

编辑:为了明确起见,我以其凭据存储在$ PSCreds中的用户身份启动powershell.exe,并向新的powershell进程提供了要在该用户的用户名下运行的cmdlet。上下文,并期望从父脚本中的该cmdlet获取结果。因此,Script1在UserA的权限/上下文下执行,但需要以UserB身份运行;但是,不接受-Credential标志,因此我需要调用此函数。我需要Script1中此函数的as UserB输出,以决定Script1中接下来将发生什么。

我已经阅读了很多有关重定向输出的内容,但是我不理解。我试过将.waitforexit()移到.readtoend()之后。我尝试做return $getprocessresult。我尝试做另一个变量来分配standarderror和一个if ($errortext) {return $errortext}之类的东西,但没有成功。

这是我函数的精简版本,不显示所有内容,而是显示(我认为是)相关部分。

Function start-PSCMDAsUser {
Param (
        [String[]]$PSCMDArgs,
        [System.Management.Automation.CredentialAttribute()]$PSCreds
        ) #Close Param declaration
    $ProcessInfo = New-Object System.Diagnostics.ProcessStartInfo
    $ProcessInfo.RedirectStandardError = $true 
    $ProcessInfo.RedirectStandardOutput = $true 
    $ProcessInfo.UseShellExecute = $false
    $ProcessInfo.Arguments = $PSCMDArgs
    $ProcessInfo.Username = $PSCreds.GetNetworkCredential().username
    $ProcessInfo.FileName = "powershell.exe"
    $Process = New-Object System.Diagnostics.Process 
    $Process.StartInfo = $ProcessInfo 
    $Process.Start() | Out-Null 
    $Process.WaitForExit() 
    $GetProcessResult = $Process.StandardOutput.ReadToEnd()
    $GetProcessResult
    } #close function start-pscmdasuser

我正在使用$PSCMDArgs = 'New-Item -Path ' + $testfile + ' -ItemType "file" -Value ' + "Tested_Share_$datetime"作为输入 start-PSCMDAsUser -PSCreds $pscreds -PSCMDArgs $PSCMDArgs

我有另一个函数(test-myshares)在foreach ($share in $shares)循环中调用此函数。我希望看到该函数的输出散布在父函数中,实际上,我希望test-myshares函数能够使用该函数的输出来智能地生成输出。但是我无法获得start-pscmdasuser函数来输出您期望的方式。实际上,我得到的是test-myshares 的所有详细输出,然后是start-pscmdasuser函数中最后一个变量的最后一位

最终,我希望能够try {start-PSCMDAsUser -PSCreds $pscreds -PSCMDArgs $PSCMDArgs } catch {do-something},但是我不确定如何使.NET输出正常工作。感谢您的帮助!

编辑:假设我正在使用脚本设置FSRM文件屏幕(这只是一个示例,实际上并不是我正在做的事情;这只是为了说明目的)。我将在脚本中运行FSRM cmdlet对其进行全部配置,然后希望该脚本通过使用目标用户的凭据使用new-item写入筛选类型的新文件来测试文件屏幕。好吧,当您使用“ -itemtype文件”时,new-item cmdlet不接受-Credential,因此我需要在目标用户的上下文下运行New-Item,以避免传递-credential。我想使用这个功能。父脚本需要知道New-Item是成功还是失败(和为什么),以验证新的文件屏幕。但是,如何将输出传递回脚本?那是我的问题,希望您能提供帮助!再次感谢你!!

0 个答案:

没有答案