3

Из командной строки Windows, если я нахожусь в c:\foo, а c:\bar находится в моем PATH.
Есть ли способ вызвать '\bin\myapp.exe' и найти его по моему пути, чтобы вызвать c:\bar\bin\myapp.exe?
возможно, префикс / переменная окружения или стандартная утилита?

Я полагаю, что вышесказанное будет хорошо работать в системе Macos/ Linux (?) и прекрасно работает в Windows, если в команде не было информации о папке (то есть c:\bar\bin находится в пути, а я вызываю только myappe.exe)

Обновление - это для сценария, который не знает (сторонний) каталог установки, он только знает, что базовый каталог находится на пути (и имя exe-файла достаточно уникально, так что он вряд ли столкнется с приложением с то же имя). Возможно, я мог бы написать скрипт для его поиска (grep), надеясь, что есть простой прием (опция cmd.exe и т.д.), Позволяющий разрешить имя подпапки в команде, аналогично тому, как это позволяет unix

2 ответа2

2

В окнах вы можете установить свои собственные переменные среды, а затем использовать их. Таким образом, вы можете перейти к:

  • Панель управления
  • система
  • Расширенные системные настройки
  • Продвинутая вкладка
  • Переменные среды

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

Пример:

Так что в вашем случае вы можете установить следующую переменную: appNameBinPath = "C:\bar". Затем вы можете использовать ее в следующем примере:

C:\foo>%appNameBinPath%\bin\myapp.exe 

В качестве альтернативы, если вы хотите установить постоянную переменную по сценарию и / или командной строке, вы можете увидеть эту статью: https://stackoverflow.com/questions/5898131/set-a-persistent-environment-variable-from-cmd-exe

1

Чтение аргументов командной строки (параметры) или call /?:

…
If Command Extensions are enabled CALL changes as follows:
…
In addition, expansion of batch script argument references (%0, %1,
etc.) have been changed as follows:
…
        %~$PATH:1   -  searches the directories listed in the PATH
                       environment variable and expands %1 to the fully
                       qualified name of the first one found.  If the
                       environment variable name is not defined or the
                       file is not found by the search, then this
                       modifier expands to the empty string
…

Команда FOR создает переменные параметров, которые обозначаются буквой, а не числом (например, %%G). Описанные выше расширения параметров также могут быть применены к ним.

Применим выше к вашему случаю (обратите внимание на удвоенный процент вздоха в %%g для использования в скрипте .bat или .cmd ):

for %%g in ("bin\myapp.exe") do @set "_pathToMyApp=%%~$PATH:g"
rem         ↑↑  NO leading backslash
rem next line calls `myapp.exe` using its fully qualified name
"%_pathToMyApp%"

Реальный пример: (обратите внимание на один процент вздоха в %g для использования из командной строки в открытом окне cmd). Моя PATH читается как …;C:\Utils\;… без дополнительной ссылки на папку C:\Utils (базовый каталог), myapp.exe - это простое приложение, которое отображает все предоставленные параметры:

d:\bat> myapp.exe
'myapp.exe' is not recognized as an internal or external command,
operable program or batch file.

d:\bat> bin\myapp.exe
The system cannot find the path specified.

d:\bat> set _
Environment variable _ not defined

d:\bat> for %g in ("bin\myapp.exe") do @set "_pathToMyApp=%~$PATH:g"

d:\bat> set _
_pathToMyApp=C:\Utils\bin\myapp.exe

d:\bat> "%_pathToMyApp%" display all parameters
param 0 = C:\Utils\bin\myapp.exe
param 1 = display
param 2 = all
param 3 = parameters

d:\bat>

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .