2012-01-27 39 views
1

我试图编写一个Powershell脚本来执行一些与我从Mercurial日志命令中获得的输出有关的事情。下面是我到目前为止有:为什么Mercurial忽略了我在Powershell中给出的回购路径?

param([string] $Path, [string] $From, [string] $To) 
$file_list = hg log -R ${Path} -r ${From}:${To} --style fileList 
$file_list 

当我运行从一个提示这个脚本名为.psl(当前工作目录是我的桌面),我收到以下错误:

hg.exe : abort: :tip not under root 

我加周围的命令引号,所以我可以看到什么是越来越像这样运行:

param([string] $Path, [string] $From, [string] $To) 
$file_list = "hg log -R ${Path} -r ${From}:${To} --style fileList" 
$file_list 

当我这样称呼它:

.\MyScript.ps1 -Path .\Projects\MyProject -From 80 -To tip 

输出正是我想要的东西:

hg log -R .\Projects\MyProject -r 80:tip --style fileList 

如果我复制和输出直接粘贴到我的命令行,log命令可以正常工作。

我找不到关于此错误消息的任何好文档。我知道这个目录是回购。它实际上没有使用我为repo root指定的目录吗? Powershell正在对我传递的路径做些什么?

回答

1

看起来像是$ {From}和$ {To}之间的冒号。我用倒退(`)来解决冒号。将脚本更改为:

param([string] $Path, [string] $From, [string] $To) 
$file_list = hg log -R ${Path} -r ${From}`:${To} --style fileList 
$file_list 

按预期运行日志命令。

总之,要小心Powershell中的冒号!

0

您不能只将库作为第一个参数传递;它需要传递给-R参数。此版本的PowerShell可以工作:

param([string] $Path, [string] $From, [string] $To) 
$file_list = hg log -R ${Path} -r ${From}:${To} --style fileList 
$file_list 
+1

我们实际上试图从命令行参数中推断出'-R'标志。所以如果你在一个仓库之外,那么你可以做'hg log my-repo/foo'。如果你已经在另一个回购站内,那么你会被告知'abort:my-repo/foo不在root下'。所以我不确定这是什么问题。 – 2012-01-27 16:03:07

+0

我实际上也尝试过,并收到错误消息。看修改后的问题。不是争论,但我没有-R运行该命令,它运行良好。你确定它不是位置参数吗?编辑:看起来像马丁证实。很高兴我不疯狂。 – 2012-01-27 16:05:39

2

Powershell在将参数传递给exe时存在问题。

只是将命令行分配给一个字符串,并查看该字符串的内容在这里不会帮助你。

有一个叫echoargs.exe util的,这是作为的Powershell Community Extensions.

部分获取通过并传递要传递到hg给它的参数,它会回显从Powershell的被提供的实际参数。

+0

看起来echoargs将第一个参数显示为“<。\ Projects \ Myproject>”,这些尖括号来自哪里?当我传入它时,将引号放在路径上看起来并没有消除它们。 $ Path上的一个GetType()只是将它显示为一个String。帮助? – 2012-01-27 16:47:50

+1

如果它说'Arg 0是',log是arg,不包括'<>' – manojlds 2012-01-27 16:48:40

+0

然后这条路径就是它的设想当我直接在命令行上键入命令时,该命令可以很好地工作。 – 2012-01-27 16:50:34

0

若要在PowerShell中调用exe s参数,我使用&

什么一直为我工作是把exe路径变量,然后我的每个参数的个数在其他变量保持整洁(只是像$arg=-d myArg),然后调用以下:

& "$path" "$arg1" "$arg2" "$arg3"和等等。

相关问题