Поведение PowerShell, когда дескриптор файла хоста закрыт - PullRequest
1 голос
/ 13 февраля 2012

Я ищу объяснение (желательно документацию) следующего безумия.

Скажем, у меня есть следующий простой сценарий Perl:

use strict;
use warnings;

my $output = "C:\\Temp\\aout.txt";
my $outpute = "C:\\Temp\\aoute.txt";
my $command = "powershell C:\\test.ps1";

close STDOUT;
close STDERR;
if ( (my $pid = fork()) == 0 ) {
    open (STDOUT,">>$output") or die "cannot open $output as stdout: $!";
    open (STDERR,">>$outpute") or die "cannot open $outpute as stderr: $!";
    exec $command or die "couldn't exec $command: $!";
} else {
    my $ret = waitpid($pid,0);
}

И что сценарий Powershell содержит:

write-output "yay1";
write-error "nay2";
write-output "yay3";
write-error "nay4";
write-output "yay5";
write-error "nay6";
write-output "yay7";
write-error "nay8";
write-host "done!";

Если я запускаю скрипт Perl, он, как и ожидалось, создает два файла со следующим выводом:

aout.txt:

yay1
yay3
yay5
yay7
done!

aoute.txt:

C:\test.ps1 : nay2
At line:1 char:41
+ C:\test.ps1 <<<< 
    + CategoryInfo          : NotSpecified: (:) [Write-Error], WriteErrorException
    + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException,test.ps1

C:\test.ps1 : nay4
At line:1 char:41
+ C:\test.ps1 <<<< 
    + CategoryInfo          : NotSpecified: (:) [Write-Error], WriteErrorException
    + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException,test.ps1

C:\test.ps1 : nay6
At line:1 char:41
+ C:\test.ps1 <<<< 
    + CategoryInfo          : NotSpecified: (:) [Write-Error], WriteErrorException
    + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException,test.ps1

C:\test.ps1 : nay8
At line:1 char:41
+ C:\test.ps1 <<<< 
    + CategoryInfo          : NotSpecified: (:) [Write-Error], WriteErrorException
    + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException,test.ps1

Если я изменю сценарий Perl, чтобы STDERR оставался закрытым перед выполнением Powershell:

use strict;
use warnings;

my $output = "C:\\Temp\\aout.txt";
my $command = "powershell C:\\test.ps1";

close STDOUT;
close STDERR;
if ( (my $pid = fork()) == 0 ) {
    open (STDOUT,">>$output") or die "cannot open $output as stdout: $!";
    exec $command or die "couldn't exec $command: $!";
} else {
    my $ret = waitpid($pid,0);
}

Затем он создает одинФайл STDOUT с всеми выходными данными:

yay1
C:\\test.ps1 : nay2
At line:1 char:41
+ C:\\test.ps1 <<<< 
    + CategoryInfo          : NotSpecified: (:) [Write-Error], WriteErrorException
    + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException,test.ps1

yay3
C:\\test.ps1 : nay4
At line:1 char:41
+ C:\\test.ps1 <<<< 
    + CategoryInfo          : NotSpecified: (:) [Write-Error], WriteErrorException
    + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException,test.ps1

yay5
C:\\test.ps1 : nay6
At line:1 char:41
+ C:\\test.ps1 <<<< 
    + CategoryInfo          : NotSpecified: (:) [Write-Error], WriteErrorException
    + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException,test.ps1

yay7
C:\\test.ps1 : nay8
At line:1 char:41
+ C:\\test.ps1 <<<< 
    + CategoryInfo          : NotSpecified: (:) [Write-Error], WriteErrorException
    + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException,test.ps1

done!

Действительно ли Powershell понимает, что STDERR закрыт, и выполняет чистое перенаправление на STDOUT?Или это консоль командной строки?Или это Perl?

Для справки, это на Windows Server 2003 x64 SP2 с:

C:\>perl --version

This is perl, v5.8.8 built for MSWin32-x64-multi-thread
(with 33 registered patches, see perl -V for more detail)

Copyright 1987-2006, Larry Wall

Binary build 819 [267479] provided by ActiveState http://www.ActiveState.com
Built Aug 27 2006 22:13:23

Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the Perl 5 source kit.

Complete documentation for Perl, including FAQ lists, should be found on
this system using "man perl" or "perldoc perl".  If you have access to the
Internet, point your browser at http://www.perl.org/, the Perl Home Page.


C:\>powershell get-host


Name             : ConsoleHost
Version          : 2.0
InstanceId       : 1ac67afa-f020-414c-b47b-031bdc8cc703
UI               : System.Management.Automation.Internal.Host.InternalHostUserInterface
CurrentCulture   : en-US
CurrentUICulture : en-US
PrivateData      : Microsoft.PowerShell.ConsoleHost+ConsoleColorProxy
IsRunspacePushed : False
Runspace         : System.Management.Automation.Runspaces.LocalRunspace

, и это часть текущих усилий, связанных с this и это .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...