我正在尝试编写一个Powershell脚本来处理我从Mercurial日志命令获得的输出。这是我到目前为止所得到的:
param([string] $Path, [string] $From, [string] $To)
$file_list = hg log -R ${Path} -r ${From}:${To} --style fileList
$file_list
当我从提示符(当前工作目录是我的桌面)运行此.ps1脚本时,出现以下错误:
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是否正在为我传入的道路做些什么?
答案 0 :(得分:2)
Powershell在将参数传递给exe时遇到了问题。
只需将命令行分配给字符串,并且看到该字符串的内容对您没有帮助。
有一个名为echoargs.exe
的工具,它是Powershell Community Extensions.
获取并将传递给hg
的参数传递给它,它将回显Powershell提供的实际参数。
答案 1 :(得分:1)
看起来它是$ {From}和$ {To}之间的冒号。我用一个反引号(`)来逃避冒号来修复它。将脚本更改为:
param([string] $Path, [string] $From, [string] $To)
$file_list = hg log -R ${Path} -r ${From}`:${To} --style fileList
$file_list
按预期运行log命令。
简而言之,谨防Powershell中的冒号!
答案 2 :(得分:0)
您不能仅将存储库作为第一个参数传递;它需要传递给-R
参数。此版本的PowerShell可以使用:
param([string] $Path, [string] $From, [string] $To)
$file_list = hg log -R ${Path} -r ${From}:${To} --style fileList
$file_list
答案 3 :(得分:0)
要使用Powershell中的参数调用exe
,我使用&
。
对我来说一直有用的是将exe
路径放在变量中,然后将其中的每个args放在其他变量中以保持整洁(就像$arg=-d myArg
之类的内容)然后调用以下内容:
& "$path" "$arg1" "$arg2" "$arg3"
等等。