hg extdiff -p и% ~ dp0 - PullRequest
       6

hg extdiff -p и% ~ dp0

3 голосов
/ 28 сентября 2011

myprogram.cmd в ПУТИ;

myprogram.cmd использует %~dp0 для определения папки, в которой он находится;

Я включил @echo %~dp0 в myprogram.cmd для отладки;

Когда я звоню myprogram.cmd из любого места, он отлично работает, отображается папка myprogram.cmd в;

Когда я звоню hg extdiff -p myprogram.cmd, она не работает, отображается что-то вроде c:\Users\Username\AppData\Local\Temp\extdiff.3n8op2\.

Вот соответствующая часть hgrc файла:

[extensions]
hgext.extdiff = 

Что я делаю не так?Разве %~dp0 не должен возвращать диск и путь к пакетному файлу?Что я использую вместо этого?Нужно ли применять какую-либо специальную конфигурацию к хранилищу Mercurial?Передача полного пути от myprogram.cmd до hg extdiff -p не вариант, если это не сделано автоматически.

Ответы [ 2 ]

2 голосов
/ 07 октября 2011

Трюк% ~ dp0 большая ложь .На самом деле это не волшебная переменная, это просто манипуляция с% 0 (или с любой другой переменной, перед которой вы ставите ~ dp).Он просто принимает значение string в этой переменной и сообщает вам, каковы его компоненты диска и пути.Если эта строка является просто именем, подобным «myprogram», она говорит: «Ну, имена файлов без дисков и путей должны быть в текущем каталоге».

Так что трюк% ~ dp0 работает только в том случае, если либо:

а) вы запустили свой скрипт по его полному имени или б) вы оказались в каталоге, в котором он находится

В этом случае вы запускаете:

hg extdiff -p myprogram

превращается в следующий вызов Windows:

CreateProcess(NULL, "cmd.exe /c myprogram some diff args", ..., "c:/some/temp/path", ...)

, что морально эквивалентно открытию оболочки и запуску:

C:\>cd c:\some\temp\path
C:\some\temp\path>myprogram some diff args
%0 is myprogram
%~dp0 is C:\some\temp\path

Я рекомендую передать полное имя программы для вашего инструментанапример, через ваш .hgrc:

[extdiff]
myprogram=c:/tools/myprogram.cmd

Но будьте осторожны, это может привести к путанице из-за присутствия пробелов в вашем имени файла, возможно, вам придется поэкспериментировать с цитированием.

1 голос
/ 22 июня 2012

Вы можете попробовать использовать% ~ dp $ PATH: 0, но вам нужно всегда указывать расширение.Например, для следующих test.cmd:

rem test.cmd
@echo dp0 == %~dp0
@echo dp$PATH:0 == %~dp$PATH:0

это два примера прогона из папки d:\hg:

$ hg extdiff -p test.cmd
dp0 == c:\Users\estefan\AppData\Local\Temp\extdiff.pamj6n\
dp$PATH:0 == k:\home\Scripts\

$ hg extdiff -p test
dp0 == c:\Users\estefan\AppData\Local\Temp\extdiff.dgp0qz\
dp$PATH:0 ==

От http://ss64.com/nt/syntax-args.html:

% ~ $ PATH: 1 Найдите переменную среды PATH и разверните% 1 до полного имени первого найденного соответствия.

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