web-dev-qa-db-fra.com

PowerShell - Commutateurs Start-Process et Cmdline

Je peux courir ça bien:

$msbuild = "C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe" 
start-process $msbuild -wait

Mais quand je lance ce code (ci-dessous), je reçois une erreur:

$msbuild = "C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe /v:q /nologo" 
start-process $msbuild -wait

Est-il possible de transmettre des paramètres à MSBuild à l'aide de start-process? Je suis ouvert à ne pas utiliser start-process, la seule raison pour laquelle je l'ai utilisé était d'avoir besoin de la "commande" en tant que variable.

Quand j'ai
C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe/v: q/nologo
sur une ligne à part, comment cela est-il traité dans Powershell?

Devrais-je utiliser une sorte de fonction eval () à la place?

70
BuddyJoe

vous allez vouloir séparer vos arguments en paramètre séparé

$msbuild = "C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe"
$arguments = "/v:q /nologo"
start-process $msbuild $arguments 
112
Glennular

En utilisant des paramètres explicites, ce serait:

$msbuild = 'C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe'
start-Process -FilePath $msbuild -ArgumentList '/v:q','/nologo'

EDIT: citations.

52
EBGreen

Attention

Si vous exécutez PowerShell à partir d'une fenêtre cmd.exe créée par Powershell, la deuxième instance n'attend plus que les travaux soient terminés.

cmd>  PowerShell
PS> Start-Process cmd.exe -Wait 

À partir de la nouvelle fenêtre cmd, exécutez PowerShell à nouveau et ouvrez une deuxième fenêtre cmd: cmd2> PowerShell.

PS> Start-Process cmd.exe -Wait
PS>   

La deuxième instance de PowerShell n'honore plus les demandes -Attente et TOUS les processus/travaux d'arrière-plan renvoient le statut "Terminé" même s'ils sont toujours en cours d'exécution!

J'ai découvert cela lorsque mon programme C # Explorer est utilisé pour ouvrir une fenêtre cmd.exe et que PS est exécuté à partir de cette fenêtre. Il ignore également la demande -Wait. Il semble que tout PowerShell qui est un "travail win32" de cmd.exe ne puisse pas honorer la demande d'attente.

J'ai rencontré cela avec la version 3.0 de PowerShell sous Windows 7/x64

6
LanDenLabs

J'ai trouvé que l'utilisation de cmd fonctionnait bien en tant qu'alternative, en particulier lorsque vous deviez canaliser la sortie de l'application appelée (en particulier lorsque la journalisation n'est pas intégrée, contrairement à msbuild).

cmd /C "$msbuild $args" >> $outputfile

5
midspace

Sauf si l'OP utilise PowerShell Community Extensions, il fournit une cmdlet Start-Process ainsi que de nombreuses autres. Si tel est le cas, la solution de Glennular fonctionne bien car elle correspond aux paramètres de position de pscx\start-process: -path (position 1) -arguments (position 2).

1
Keith Hill