Начать процесс с args, который содержит путь с пробелами

Мне нужно запустить процесс из powershell script и передать такие параметры: -a -s f1d:\some directory\с пробелами в пути \file.iss для этого я пишу следующий код:

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

в результате процесс начинается, но последний аргумент: -f1d:\some directory\с пробелами в пути \file.iss не проходит правильно. Помогите пожалуйста

Ответ 1

Я думаю, вы можете использовать Start-Process:

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

Ответ 2

Я понимаю, что ваш вопрос: Как передать несколько аргументов для запуска процесса, когда один из аргументов имеет пробелы?

Я предполагаю, что эквивалент в пакетном файле Windows будет выглядеть примерно так:

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

где двойные кавычки позволяют процессу приема (setupFilePath в этом случае) получать три аргумента:

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

Чтобы выполнить это с помощью фрагмента кода в вашем вопросе, я бы использовал обратные тики (слева от 1 и ниже клавиши эвакуации, чтобы не путать с одной цитатой, а также Grave-accent), чтобы избежать внутреннего двойного цитирует:

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

Обратите внимание, что помимо использования обратных тиков я также сменил одинарные кавычки вокруг вашего списка аргументов на двойные кавычки. Это было необходимо, потому что одинарные кавычки не позволяют нам использовать экраны (http://ss64.com/ps/syntax-esc.html).

Ответ Аарона должен работать нормально. Если это не так, я бы предположил, что setupFilePath не интерпретирует -f1"d:\space here\file.ext", как вы ожидаете.

ПРЕДУПРЕЖДЕНИЕ МНЕНИЯ Единственное, что я хотел бы добавить к его ответу, - предложить использовать двойные кавычки и обратные тики, чтобы разрешить использование переменной в пути для аргумента -f1:

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

Таким образом, у вас не будет жестко закодированного абсолютного пути в середине длинной строки.

Ответ 3

В PowerShell v3 это работает:

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

Используя PSCX, команда echoargs показывает это:

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"

На использовании V2 - обратите внимание на добавление обратной ссылки на последнюю двойную кавычку:

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"