web-dev-qa-db-fra.com

Démarrer le processus avec des arguments contenant un chemin avec des blancs

J'ai besoin de démarrer un processus à partir d'un script PowerShell et de transmettre ces paramètres: -a -s f1d:\un répertoire\avec des blancs dans un chemin\file.iss pour ce faire, j'écris le code suivant:

$process = [System.Diagnostics.Process]::Start("$setupFilePath", '-a -s -f1"d:\some directory\with blanks in a path\fileVCCS.iss"') 
$process.WaitForExit()

en conséquence, le processus démarre mais le dernier argument: -f1d:\un répertoire\avec des blancs dans un chemin\file.iss ne passe pas correctement. Aidez-moi, s'il vous plaît

14
vklu4itesvet

Je pense que vous pouvez utiliser Start-Process:

Start-Process -FilePath $setupFilePath -ArgumentList '-a','-s','-f1"d:\some directory\with blanks in a path\fileVCCS.iss"' |
    Wait-Process
9
Aaron Jensen

Je comprends que votre question soit: Comment passer plusieurs arguments pour démarrer un processus où l'un des arguments a des espaces?

Je suppose que l'équivalent dans un fichier de commandes Windows serait quelque chose comme:

"%setupFilePath%" -a -s -f1"d:\some directory\with blanks in a path\fileVCCS.iss"

où les guillemets doubles permettent au processus de réception ( setupFilePath dans ce cas) de recevoir trois arguments:

  1. -a
  2. -s
  3. -f1"d:\some directory\with blanks in a path\fileVCCS.iss"

Pour ce faire, avec l'extrait de code dans votre question, j'utiliserais des tiques de retour ( à gauche du 1 et en dessous de la touche d'échappement, à ne pas confondre avec une seule citation; aka Grave-accent ) pour échapper aux doubles guillemets intérieurs comme ceci:

$process = [System.Diagnostics.Process]::Start("$setupFilePath", "-a -s -f1`"d:\some directory\with blanks in a path\fileVCCS.iss`"") 
$process.WaitForExit()

Notez qu'en plus d'utiliser les tiques inverses, j'ai également changé les guillemets simples autour de votre liste d'arguments en guillemets doubles. C'était nécessaire car les guillemets simples ne permettent pas les échappements dont nous avons besoin ici ( http://ss64.com/ps/syntax-esc.html ).

réponse d'Aaron devrait fonctionner très bien. Si ce n'est pas le cas, je suppose que setupFilePath n'interprète pas -f1"d:\space here\file.ext" comme vous vous y attendez.

ALERTE D'OPINION La seule chose que j'ajouterais à sa réponse est de suggérer d'utiliser des guillemets doubles et des ticks arrière afin de permettre l'utilisation d'une variable dans le chemin d'accès pour l'argument -f1:

Start-Process -FilePath $setupFilePath -ArgumentList '-a','-s',"-f1`"$pathToVCCS`"" |
Wait-Process

De cette façon, vous n'aurez pas de chemin absolu codé en dur au milieu d'une longue ligne.

5
Benrobot

Sur PowerShell v3, cela fonctionne:

& $setupFilePath -a -s -f1:"d:\some directory\with blanks in a path\fileVCCS.iss"

L'utilisation de la commande PSCX echoargs montre ceci:

25> echoargs.exe -a -s -f1"d:\some directory\with blanks in a path\fileVCCS.iss"
Arg 0 is <-a>
Arg 1 is <-s>
Arg 2 is <-f1d:\some directory\with blanks in a path\fileVCCS.iss>

Command line:
"C:\Program Files (x86)\PowerShell Community Extensions\Pscx3\Pscx\Apps\EchoArgs.exe"  -a -s "-f1d:\some directory\with blanks in a path\fileVCCS.iss"

Sur l'utilisation de V2 - notez l'ajout d'un backtick sur la dernière citation double:

PS> echoargs.exe -a -s -f1"d:\some directory\with blanks in a path\fileVCCS.iss`"
Arg 0 is <-a>
Arg 1 is <-s>
Arg 2 is <-f1d:\some directory\with blanks in a path\fileVCCS.iss>

Command line:
"C:\Program Files (x86)\PowerShell Community Extensions\Pscx3\Pscx\Apps\EchoArgs.exe"  -a -s -f1"d:\some directory\with blanks in a path\fileVCCS.iss"
2
Keith Hill