К обобщить Полезный ответ Гюнтера Шмитца :
PowerShell имеет несколько типов команд , чей приоритет равен:
- Псевдоним
- Функция
- Cmdlet
- Внешнее приложение
Обратите внимание, что разрешение имен всегда регистр нечувствительно , так что и r
, и R
относятся к одной и той же команде.
То есть, прежде чем R
преобразуется в R.exe
, это может помешать не только r
псевдоним , но также функция или cmdlet (хотя последний случай является гипотетическим, поскольку командлеты с хорошим поведением следуют шаблону именования <Verb>-<Noun>
).
Обратите внимание, что встроенные псевдонимы, отслеживающие внешние программы, особенно стандартные, проблематичны, и в контексте PowerShell Core ведется дискуссия о том, удалять ли все встроенные псевдонимы и сделайте их opt-in only - см. этот выпуск GitHub .
Чтобы увидеть, к чему относится данное имя, используйте командлет Get-Command
:
# See what R resolves to
Get-Command R
# See ALL commands that R *can* resolve to, with the EFFECTIVE one listed first:
Get-Command -All R
Варианты однозначного таргетинга R.exe
:
(Как вы уже знаете) Если его папка находится в одной из папок, перечисленных в переменной среды $env:PATH
, добавьте .exe
- т. Е. Используйте имя файла extension явно:
R.exe ...
Используйте полный путь R.exe
(обратите внимание на необходимость &
для вызова, потому что путь должен заключаться в кавычки):
& "C:\Program Files\R\R-3.5.0\bin\x64\R.exe" ...
(Ради полноты; это громоздкий эквивалент использования просто R.exe
): используйте Get-Command -Type Application R
, чтобы найти исполняемый файл:
& (Get-Command -Type Application R) ...