.net - 如何从 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。我想使用这个功能。并且父脚本需要知道新项目是成功还是失败(以及为什么)来验证新的文件屏幕。但是如何将该输出传递回脚本?那是我的问题,我 我希望你能帮忙!再次感谢你!!
解决方案
推荐阅读
- python - What benefits does the % formatter offer in comparison to f strings?
- github - I want to push git easily
- linechart - 悬停时的着色线对于带有点的线与仅在 vega-lite 中的线的工作方式不同
- node.js - How to pass variable into function [ different file] using node js express
- python - 为什么在 python 中执行 argparse 时出现错误
- python - 为什么通过 Matlab 在调用 Python websocket 函数时添加关键字参数会引发错误?
- javascript - How can I trigger a method when end date is changed
- r - 在使用 ggplot 时将离散值提供给连续比例
- javascript - 如何在构建时格式化外部链接?
- java - 是否可以只为节点的一部分着色?