hg extdiff -p和%~dp0

时间:2011-09-28 16:23:45

标签: mercurial batch-file cmd

myprogram.cmd在PATH中;

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 个答案:

答案 0 :(得分:2)

%~dp0技巧是一个很大的谎言。它实际上并不是一个神奇的变量,它只是对%0的操纵(或者你在前面贴上~dp的变量)。它只需要在该变量中包含字符串,并告诉您它的驱动器和路径组件是什么。如果该字符串只是一个名为“myprogram”的名称,则说“好吧,假设没有驱动器和路径的文件名在当前目录中”。

所以%~dp0技巧只适用于:

a)您已使用其全名或推出了脚本 b)你碰巧在它所在的目录中

在这种情况下,您运行:

hg extdiff -p myprogram

变成以下对Windows的调用:

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

这在道德上等同于打开一个shell并运行:

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 :(得分:1)

您可以尝试使用%~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展开为找到的第一个匹配项的完全限定名称。