Передача параметров в exe

У меня есть ряд сценариев, в которых мне нужно передать параметры в exe командной строки.

Я видел несколько ответов на этом сайте в некоторой степени, но до сих пор я не видел четкого, общего назначения, описания того, как powershell работает с параметрами - оба передаются cmd или start-process. Вот один тривиальный пример, который меня беспокоит:

Вот сценарий летучей мыши:

CD /D %ProgramFiles(x86)%\Microsoft Visual Studio 10.0\Common7\IDE
devenv /command "File.BatchNewTeamProject C:\stuff\Project51.xml"

Что я не понимаю, так это то, как powershell анализирует эти аргументы. Что он считает "параметром"?

Кроме того, те же правила для запуска процесса, как и для cmd.exe?

2 ответа

Решение

Попробуйте эту функцию из http://powershell.com/cs/ PowerTip, она иллюстрирует использование Invoke-Expression,

function Call {
  $command = $Args -join " "
  $command += " 2>&1"
  $result = Invoke-Expression($command)
  $result | 
    %{$e=""}{ if( $_.WriteErrorStream ) {$e += $_ } else {$_} }{Write-Warning $e}
}

Это дает:

cd "${env:ProgramFiles(x86)}\Microsoft Visual Studio 10.0\Common7\IDE"
call .\devenv.exe /command "`"File.BatchNewTeamProject C:\stuff\Project51.xml`"

--- Редактировать ---

Есть много вещей, чтобы сказать здесь.

Сначала вы можете найти хорошую справку по файлам about, попробуйте:

Получить помощь о- *

По интересующей вас теме вы получили:

Get-help about_Quoting_Rules
Get-Help about_Special_Characters
Get-Help about_Escape_Characters
Get-Help about_Parameters

второй CD, DIR, MD работает, но это просто псевдонимы в CmdLets, которые принимают разные аргументы.

В-третьих, чтобы получить переменную среды, она больше не %systemroot% его $env:systemroot,

В-четвертых, чтобы запустить исполняемый файл из powershell, вы можете просто ввести имя исполняемого файла:

PS> notepad c:\temp\test.txt

Командная строка сначала интерпретируется PowerShell, так что теперь, если вы напишите:

PS> "C:\Windows\System32\notepad.exe"
C:\Windows\System32\notepad.exe

Это просто интерпретировать как строку. Таким образом, вы можете использовать оператор & и написать

PS> & "C:\Windows\System32\notepad.exe" c:\test.txt

Это работает, но:

PS> $a = "C:\Windows\System32\notepad.exe c:\test.txt"
PS> & $a

Неудачи и

PS> $a = "C:\Windows\System32\notepad.exe c:\test.txt"
PS> Invoke-Expression $a

Работает

Просто передайте параметры, как в файле BAT.

cd "$($env:ProgramFiles(x86))\Microsoft Visual Studio 10.0\Common7\IDE"
devenv /command "File.BatchNewTeamProject C:\stuff\Project51.xml"

Это передаст два аргумента devenv.

Теперь я столкнулся с несколькими случаями, когда приложение требует, чтобы кавычки были в той строке, которую вы передаете. У меня были некоторые проблемы с этим, и я подумал, что PowerShell отбрасывает цитаты. Но оказывается, что настоящая проблема заключается в том, что PowerShell не экранирует кавычки. Так что вам нужно сделать это.

devenv /command '\"File.BatchNewTeamProject C:\stuff\Project51.xml\"'
Другие вопросы по тегам