'sudo' 脚本的输出是否打印到同一个 Powershell 窗口?

'sudo' 脚本的输出是否打印到同一个 Powershell 窗口?

我在网上找到了这个“sudo”脚本:

function Elevate-Process
{
    $file, [string]$arguments = $args;
    if([System.IO.File]::Exists("$(get-location)\$file"))
    {
    $file = "$(Get-Location)\$file";
    }
    $psi = new-object System.Diagnostics.ProcessStartInfo $file;
    $psi.Arguments = $arguments;
    $psi.Verb = "runas";
    [System.Diagnostics.Process]::Start($psi);
}

set-alias sudo Elevate-Process;

它运行良好,但问题是,如果您将它与没有 GUI 的应用程序一起使用,它会在不同的提升窗口中生成该进程。

例如,如果我运行sudo sfc /scannow,输出将在新窗口中,而旧窗口将给我以下输出:

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------     -- -----------
      0       2      280         76 ...55     0.00   7964 sfc

是否可以在非提升的 Powershell 窗口中显示使用“sudo”运行的命令的输出?如果不能,是否有其他方法可以提升非管理员 Powershell 窗口,而不会将输出打印到单独的窗口?

答案1

您正在寻找一种将另一个进程的输出重定向到您的单独进程的方法,即进程间通信。您使用的“sudo”函数只是使用动词“runas”启动一个进程,它在启动单独进程之前提示 UAC。这里列出了几种解决方案:

https://msdn.microsoft.com/en-us/library/windows/desktop/aa365574%28v=vs.85%29.aspx

一种解决方法可能就足够了,那就是将应用程序的标准输出重定向到文本文件,然后读取输出。

function Elevate-Process
{
param(
$file, 
[string]$arguments = $args,
[string]$RedirectStandardOutput = 'C:\redirected.txt'
)
if([System.IO.File]::Exists("$(get-location)\$file"))
{
$file = "$(Get-Location)\$file";
}
$psi = new-object System.Diagnostics.ProcessStartInfo 'cmd.exe';
$psi.Arguments = "/c $file $arguments > $RedirectStandardOutput";
$psi.Verb = "runas";
$process = [System.Diagnostics.Process]::Start($psi);
get-content -path $RedirectStandardOutput -wait
}
set-alias sudo Elevate-Process;

当命令处理完成后运行该应用程序sudo sfc /cannow -RedirectStandardOutput C:\Wherever\Whatever.txt ,您必须选择ctrl + c返回提示。

否则,最简单\可靠的方法是通过命名管道或通过 TCP\IP 套接字传递输出。

相关内容