Puncte:0

PowerShell pe Windows: Start-Process eșuează dacă sunt folosite argumente de redirecționare a ieșirii

drapel rs

De ce Start-Proces nu reușește să găsească executabilul (nu în cale) dacă -RedirectStandardOutput sau -RedirectStandardError sunt specificate?

i.e.

[X:\] Start-Process -FilePath "prog.exe" -WorkingDirectory (Get-Location).Cale

Programul pornește și se execută așa cum ar trebui. Dar când adaug redirecționarea ieșirii, totul se destramă:

[X:\] Start-Process -FilePath "prog.exe" -WorkingDirectory (Get-Location). Path -RedirectStandardOutput stdout.txt
Start-Process: Această comandă nu poate fi rulată din cauza erorii: Sistemul nu poate găsi fișierul specificat.

Redirecționarea cu 1>stdout.txt operatorul funcționează conform așteptărilor.

Acest lucru pare să nu afecteze programele care se află în directoarele enumerate în CALE. Nu pot să-mi dau seama care este logica aici. Redirecționările nu ar trebui să aibă nimic de-a face cu rezolvarea căii binare în primul rând.

Rulează pe Windows 10 Professional.

Actualizați: Urmă completă și reproductor simplu

PS> cat .\hello.c
#include <stdio.h>

int main(int argc, char** argv)
{
        printf("Meh\n");
        getchar();
        returnează 0;
}

PS> cl salut.c
Microsoft (R) C/C++ Optimizing Compiler Versiunea 19.29.30138 pentru x86
Copyright (C) Microsoft Corporation. Toate drepturile rezervate.

buna
Microsoft (R) Incremental Linker Versiunea 14.29.30138.0
Copyright (C) Microsoft Corporation. Toate drepturile rezervate.

/out:hello.exe
salut.obj

PS> Start-Process -FilePath hello.exe -WorkingDirectory (Get-Location).Path

PS> Start-Process -FilePath hello.exe -WorkingDirectory (Get-Location). Path -RedirectStandardOutput stdout.txt
Start-Process: Această comandă nu poate fi rulată din cauza erorii: Sistemul nu poate găsi fișierul specificat.
La linia:1 char:1
+ Start-Process -FilePath hello.exe -WorkingDirectory (Get-Location).Pa ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo: InvalidOperation: (:) [Start-Process], InvalidOperationException
    + FullyQualifiedErrorId: InvalidOperationException,Microsoft.PowerShell.Commands.StartProcessCommand

Actualizare 2:

Se pare că utilizarea căii absolute pentru executabil este o soluție pentru problemă. (Deși nu explică de ce direcția de ieșire rupe rezoluția numelui/căii executabilului în primul rând)

JosefZ avatar
drapel th
Ciudat... Ce iese din `where.exe "prog.exe"`? Înainte și după exemplul de _rulare_ (adică fără niciun parametru `-RedirectStandard`)? Poate că `prog.exe` schimbă `$env:PATH` sau o mapare a unității?
drapel rs
Ieșirea programului nu contează/are nici un efect, deoarece spargerea are loc în PowerShell, chiar înainte ca programul să fie executat. Programele pe care încerc să le execut folosind această schemă sunt toate aplicațiile pentru consolă Windows fără GUI. A actualizat întrebarea cu un reproductor minim.
drapel rs
Am uitat să adaug că programul care urmează să fie rulat este aplicația noastră internă, așa că știu că nu se schimbă cu `PATH` -- cu excepția cazului în care implementarea MSVC CRT face ceva neplăcut când ieșirea este transmisă :)

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.