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

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

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

Здесь bat script:

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

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

Кроме того, являются ли правила одинаковыми для начального процесса, как для cmd.exe?

Ответ 1

Попробуйте эту функцию, исходящую из PowerShell.com 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 - *

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

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

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

Третий, чтобы получить переменную окружения больше %systemroot% it $env:systemroot.

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

PS> notepad c:\temp\test.txt

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

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

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

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

Работа

Ответ 2

Просто передайте параметры, как в вашем 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\"'