`Start-Process` не может найти файл, который существует в PATH, даже если указан абсолютный путь к файлу - PullRequest
1 голос
/ 06 февраля 2020

Я пытаюсь использовать Start-Process в Powershell Core, используя переменную, чтобы указать, какой процесс нужно запустить. Я знаю, что dotnet находится в моем PATH, поэтому это работает:

$DotnetRunCommandApp = 'run --project path/to/my/project.csproj'
Start-Process dotnet -ArgumentList $DotnetRunCommandApp

Однако, когда я пытаюсь переместить dotnet в переменную, подобную этой:

$DotnetCommand = 'dotnet'
$DotnetRunCommandApp = 'run --project path/to/my/project.csproj'
Start-Process $DotnetCommand -ArgumentList $DotnetRunCommandApp

или даже используя абсолютный путь к dotnet следующим образом:

$DotnetCommand = Resolve-Path ((Get-Command dotnet).Source | Out-String -NoNewline)

if (-not (Test-Path $DotnetCommand)) {
  Write-Error "Can not find '$DotnetCommand'"
} else {
  Write-Debug "Found $DotnetCommand" # Logs "DEBUG: Found C:\Program Files\dotnet\dotnet.exe"
}

$DotnetRunCommandApp = 'run --project path/to/my/project.csproj'
Start-Process $DotnetCommand -ArgumentList $DotnetRunCommandApp

Я получаю InvalidOperationException:

This command cannot be run due to the error: The system cannot find the file specified.

Не уверен, почему Start-Process не может найти файл, несмотря на то, что он do существует в моем PATH или даже когда я указываю командлету полный путь.


Моя конечная цель - указать параметры в объекте и просто передать этот объект в Start-Process. Это часть скрипта pw sh, который запускается на моем агенте сборки для тестирования шаблона webjob. Хотя я хочу немного отличаться локально, см. Переключатель $Azure ниже:

$StartProcessParams = @{
  FilePath               = $DotnetCommand
  ArgumentList           = $DotnetRunCommandApp
  RedirectStandardError  = (Resolve-Path $WebJobErrorLogFile)
  RedirectStandardOutput = (Resolve-Path $WebJobLogFile)
  PassThru               = $true;

  # Logging works best if we keep the process in the same "window" on Azure. Locally let the
  # WebJob run in a new windows to make it really easy to kill the process in case of any errors
  NoNewWindow            = $Azure;
}

$WebJobProcess = Start-Process $StartProcessParams

Ответы [ 2 ]

1 голос
/ 11 февраля 2020

Как отметил @iRon в комментариях, проблема в том, что я не использую splatting правильно. Я использую $StartProcessParams вместо @StartProcessParams (разница в первом символе; $ против @). Это прекрасно работает:

$StartProcessParams = @{
  FilePath               = $DotnetCommand
  ArgumentList           = $DotnetRunCommandApp
  RedirectStandardError  = (Resolve-Path $WebJobErrorLogFile)
  RedirectStandardOutput = (Resolve-Path $WebJobLogFile)
  PassThru               = $true;

  # Logging works best if we keep the process in the same "window" on Azure. Locally let the
  # WebJob run in a new windows to make it really easy to kill the process in case of any errors
  NoNewWindow            = $Azure;
}

$WebJobProcess = Start-Process @StartProcessParams
1 голос
/ 06 февраля 2020

Согласно справочной документации для Start-Process

If you specify only a filename, use the WorkingDirectory parameter to specify the path."

The WorkingDirectory Paramter "specifies the location of the executable file or document that runs in the process. The default is the current folder."

Попробуйте выполнить следующую команду:

Start-Process $DotnetCommand -ArgumentList $DotnetRunCommandApp -WorkingDirectory </dir/to/PATH>

Возможно, проблема в том, что она пытается разрешить переменное содержимое 'do tnet 'из вашего текущего каталога, а не из вашего местоположения PATH.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...