我需要将标准输出和错误日志从几个进程收集到一个日志文件中.
因此,每个输出都必须附加到此日志文件.
我想用这样的行调用所有作业:
$p=start-process myjob.bat -redirectstandardoutput $logfile -redirecterroroutput $logfile -wait
Run Code Online (Sandbox Code Playgroud)
我需要在哪里附加信息?
是否有可能在一次运行中将stdout从外部程序重定向到外部程序的变量和stderr到另一个变量?
例如:
$global:ERRORS = @();
$global:PROGERR = @();
function test() {
# Can we redirect errors to $PROGERR here, leaving stdout for $OUTPUT?
$OUTPUT = (& myprogram.exe 'argv[0]', 'argv[1]');
if ( $OUTPUT | select-string -Pattern "foo" ) {
# do stuff
} else {
$global:ERRORS += "test(): oh noes! 'foo' missing!";
}
}
test;
if ( @($global:ERRORS).length -gt 0 ) {
Write-Host "Script specific error occurred";
foreach ( $err in $global:ERRORS ) {
$host.ui.WriteErrorLine("err: $err");
}
} else {
Write-Host …Run Code Online (Sandbox Code Playgroud) 我想从PowerShell启动一个Java程序,并在控制台上打印结果.
我已按照此问题的说明操作: 使用Start-Process捕获标准输出和错误
但对我来说,这不符合我的预期.我做错了什么?
这是脚本:
$psi = New-object System.Diagnostics.ProcessStartInfo
$psi.CreateNoWindow = $true
$psi.UseShellExecute = $false
$psi.RedirectStandardOutput = $true
$psi.RedirectStandardError = $true
$psi.FileName = 'java.exe'
$psi.Arguments = @("-jar","tools\compiler.jar","--compilation_level", "ADVANCED_OPTIMIZATIONS", "--js", $BuildFile, "--js_output_file", $BuildMinFile)
$process = New-Object System.Diagnostics.Process
$process.StartInfo = $psi
$process.Start() | Out-Null
$process.WaitForExit()
$output = $process.StandardOutput.ReadToEnd()
$output
Run Code Online (Sandbox Code Playgroud)
该$output变量总是空的(并且没有打印过程的控制台上).
我正在尝试在 PowerShell ISE 中调试脚本,但我遇到了一个问题,其中一行的正常输出被 ISE 解释为错误
我已经能够简化这个问题的重现:我在https://www.openssl.org/related/binaries.html获得了任何版本的 openssl (我用 1.0.2d x86 来自链接存储库http:/ /slproweb.com/products/Win32OpenSSL.html )
我打开 Powershell ISE,导航到 exe 所在的位置并运行以下命令:
$ErrorActionPreference = "Stop"
$env:OPENSSL_CONF = ((Resolve-Path "openssl.cfg").Path)
&openssl.exe genrsa
Run Code Online (Sandbox Code Playgroud)
输出是红色的,开始是这样的:
openssl.exe : Loading 'screen' into random state - done
At line:1 char:1
+ &C:\Trayport\OpenSsl\openssl.exe genrsa
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (Loading 'screen...om state - done:String) [], RemoteException
+ FullyQualifiedErrorId : NativeCommandError
Generating RSA private key, 2048 bit long modulus
Run Code Online (Sandbox Code Playgroud)
如果我在正常的 PowerShell 命令窗口中运行它,输出相同但为白色,不会被视为错误
Loading 'screen' into random state …Run Code Online (Sandbox Code Playgroud) powershell openssl powershell-ise powershell-3.0 powershell-4.0
在 powershell 脚本中,我正在运行一个命令,该命令以管理员身份启动一个新的 powershell(如果我不是,如果需要,取决于$arg),然后运行该脚本。
我正在尝试将 stdout 和 stderr 重定向到第一个终端。
不是试图让事情变得更容易,也有争论。
param([string]$arg="help")
if($arg -eq "start" -Or $arg -eq "stop")
{
if().groups -match "S-1-5-32-544"))
{
Start-Process powershell -Verb runas -ArgumentList " -file servicemssql.ps1 $arg"
exit
}
}
$Services = "MSSQLSERVER", "SQLSERVERAGENT", "MSSQLServerOLAPService", "SSASTELEMETRY", "SQLBrowser", `
"SQLTELEMETRY", "MSSQLLaunchpad", "SQLWriter", "MSSQLFDLauncher"
function startsql {
"starting SQL services"
Foreach ($s in $Services) {
"starting $s"
Start-Service -Name "$s"
}
}
function stopsql {
"stopping SQL services"
Foreach ($s in $Services) {
"stopping $s" …Run Code Online (Sandbox Code Playgroud) 我正在 Windows 运行器上使用 GitHub 操作步骤。我尝试运行的可执行文件的要求之一是它不能以管理员身份运行。
有什么方法可以创建并成为 Windows 运行者上操作使用的默认管理员帐户的不同用户吗?
我正在尝试使用以下代码运行cmd命令:
ProcessStartInfo cmd = new ProcessStartInfo("cmd.exe");
cmd.RedirectStandardInput = true;
cmd.RedirectStandardOutput = true;
cmd.RedirectStandardError = true;
cmd.UseShellExecute = false;
cmd.CreateNoWindow = true;
cmd.WindowStyle = ProcessWindowStyle.Hidden;
Process exec = Process.Start(cmd);
exec.StandardInput.WriteLine("sc create \"BaliService\" binPath= \"{0}\\BaliService.exe\"", Directory.GetCurrentDirectory());
Run Code Online (Sandbox Code Playgroud)
此命令需要管理员privelages,如果我以管理员身份运行cmd并键入命令它完美运行但不是当我以管理员身份运行此应用程序时.我已经添加了
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
每次打开exe时提示uac的清单文件.
我已经看到了关于这个的多个问题,他们似乎都建议在提升的应用程序下运行的任何进程都具有相同的权限,但这对我不起作用.
我试过cmd.Verb = "runas";但没有骰子.
我正在使用 PowerShell 语法:
Start-Process -FilePath $file -ArgumentList $argList -NoNewWindow -Wait
Run Code Online (Sandbox Code Playgroud)
正在启动的进程是一个安装程序,它安装 Windows 服务,然后启动该服务,然后该进程停止。发生的情况是我的脚本无限期挂起,即使在进程成功完成并且进程已退出之后(正如我在任务管理器中看到的那样。当我从命令行运行它时,没有 PowerShell,它在一分钟内完成)。显然,它仍在等待,因为有一个从原始进程生成的子进程。如何告诉 PowerShell 仅等待初始进程 ($file) 而不是任何子进程?
谢谢
powershell ×6
windows ×3
process ×2
admin-rights ×1
c# ×1
command-line ×1
github-api ×1
java ×1
openssl ×1
psexec ×1
runas ×1
stderr ×1
stdout ×1