首页 > 解决方案 > 如何从 PowerShell 函数中获取 .NET StandardOutput 和 StandardError

问题描述

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

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

我已经阅读了很多关于重定向输出的内容,但我不明白。我尝试将 .waitforexit() 移到 .readtoend() 之后。我试过做return $getprocessresult. 我试过做另一个变量来分配标准错误和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

foreach ($share in $shares)我有另一个函数(test-myshares)在循环中调用这个函数。我希望看到这个函数的输出散布在父函数中,事实上,我希望这个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。我想使用这个功能。并且父脚本需要知道新项目是成功还是失败(以及为什么)来验证新的文件屏幕。但是如何将该输出传递回脚本?那是我的问题,我 我希望你能帮忙!再次感谢你!!

标签: .netpowershellerror-handlingoutput

解决方案


推荐阅读