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
不是一种选择,除非它是自动完成的。
答案 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展开为找到的第一个匹配项的完全限定名称。