我试图通过powershell脚本运行一些基本的Win32可执行文件,我神秘地从可执行文件中获取没有输出。经过大量调查,这是我发现的:
1)可执行文件以NULL输出静默失败。 shell上没有显示任何文字。将输出管道化为变量会导致该变量为NULL。
2)发生此问题时,可执行文件似乎根本不运行。我创建了一个虚拟可执行文件,写入stdout,stderr,并使用fstream创建两个文件。调用exe时,这三个输出都不会发生。
3)这只会影响powershell的某些实例。一个ISE实例和一个PowerShell实例受到影响。他们都在同一天开放。第二天打开的新实例正确运行可执行文件,按预期显示shell上的stdout输出。受影响的实例未以管理员身份运行。以管理员身份运行一些新shell:一切正常。
4)已使用两个可执行文件对此进行了测试和验证。两者都是在Visual Studio 2010中构建的Win32控制台应用程序。两者都写入stdout,stderr和文件。
5)所有在受影响的shell中管道和重定向输出的尝试都会失败,因为没有输出。以下示例。
6)使用带有可执行文件名的Invoke-Item会短暂弹出另一个控制台窗口,但是任何捕获该输出的尝试都失败了。
7)我已经比较了两个shell的环境变量,并没有区别。
8)存在可执行文件,如果使用无效的名称或路径,则在两个shell中都会出现通常的“找不到文件”错误。只有可执行文件存在时才会发生不一致的行为。
我已经没有什么可以尝试了,而且谷歌搜索已经提出了很多关于重定向输出的文章,但是我看到的任何人都没有提到可执行文件只是默默地失败。
普通shell上的行为:
PS C:\Users\Foo\dev\Testing\OutputTest\Release> dir
Directory: C:\Users\Foo\dev\Testing\OutputTest\Release
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 12/13/2013 10:34 AM 20992 OutputTest.exe
-a--- 12/13/2013 10:34 AM 543744 OutputTest.pdb
PS C:\Users\Foo\dev\Testing\OutputTest\Release> .\OutputTest.exe
Output to stdout.
Output to stderr.
Wrote to file 1.
Wrote to file 1.
PS C:\Users\Foo\dev\Testing\OutputTest\Release> & ".\OutputTest.exe"
Output to stdout.
Output to stderr.
Wrote to file 1.
Wrote to file 1.
PS C:\Users\Foo\dev\Testing\OutputTest\Release> $output = cmd /c OutputTest.exe 2`>`&1
PS C:\Users\Foo\dev\Testing\OutputTest\Release> $output
Output to stdout.
Output to stderr.
Wrote to file 1.
Wrote to file 1.
PS C:\Users\Foo\dev\Testing\OutputTest\Release> $output = $(cmd /c OutputTest.exe 2`>`&1)
PS C:\Users\Foo\dev\Testing\OutputTest\Release> $output
Output to stdout.
Output to stderr.
Wrote to file 1.
Wrote to file 1.
PS C:\Users\Foo\dev\Testing\OutputTest\Release>
受影响的shell上的行为:
PS C:\Users\Foo\dev\Testing\OutputTest\Release> dir
Directory: C:\Users\Foo\dev\Testing\OutputTest\Release
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 12/13/2013 10:34 AM 20992 OutputTest.exe
-a--- 12/13/2013 10:34 AM 543744 OutputTest.pdb
PS C:\Users\Foo\dev\Testing\OutputTest\Release> .\OutputTest.exe
PS C:\Users\Foo\dev\Testing\OutputTest\Release> & ".\OutputTest.exe"
PS C:\Users\Foo\dev\Testing\OutputTest\Release> $output = cmd /c OutputTest.exe 2`>`&1
PS C:\Users\Foo\dev\Testing\OutputTest\Release> $output
PS C:\Users\Foo\dev\Testing\OutputTest\Release> $output = $(cmd /c OutputTest.exe 2`>`&1)
PS C:\Users\Foo\dev\Testing\OutputTest\Release> $output
PS C:\Users\Foo\dev\Testing\OutputTest\Release>
在上述所有“受影响”的情况下,没有文件写入磁盘。 任何人?我假设这是一个简单而愚蠢的东西,但除非我能期望EXE一直运行,否则PowerShell对我来说是零用途。我做错了什么?
系统详情:
Windows 7 Pro Sp1
PS C:\Users\Foo\dev\Testing\OutputTest\Release> $PSVersionTable.psversion
Major Minor Build Revision
----- ----- ----- --------
2 0 -1 -1
OutputTest.exe的来源
#include "stdafx.h"
#include <iostream>
#include <fstream>
int main(int argc, char* argv[])
{
std::cout << "Output to stdout.\n";
std::cerr << "Output to stderr.\n";
std::fstream outfile1;
std::fstream outfile2;
outfile1.open("C:\\temp\\outputTest1.txt",std::fstream::out);
outfile2.open("outputTest2.txt",std::fstream::out);
if(outfile1.is_open()){
outfile1 << "Output to fstream 1.\n";
std::cout << "Wrote to file 1.\n";
outfile1.close();
}
if(outfile2.is_open()){
outfile2 << "Output to fstream 2.\n";
std::cout << "Wrote to file 1.\n";
outfile2.close();
}
return 0;
}
是的,我现在看到我没有编辑最后一个std :: cout来改变数字:P