powershell exe调用在某些shell实例上失败,而在其他shell实例上失败

时间:2013-12-13 20:05:29

标签: shell powershell output exe

我试图通过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

0 个答案:

没有答案