如何在Windows cmd上执行git log?

Mat*_*ari 3 windows git bash batch-file

我有以下命令:

git log --pretty=tformat:'<li>%h %ci %d %s</li>' > changelog.html
Run Code Online (Sandbox Code Playgroud)

这将git日志保存到changelog.html文件中.当我通过git bash执行它时,它运行正常,但是当我将此代码放在.bat文件中并运行它时,我收到以下错误:

The system could not find the specified file

我认为这是由格式参数的引号引起的,但我不知道如何解决问题...有没有办法逃避引号呢?

mkl*_*nt0 11

在Windows批处理文件中,您必须:

  • %字符.他们被视为文字
  • 使用引号来保护嵌入的空格或其他特殊字符.如>:
git log --pretty=tformat:"<li>%%h %%ci %%d %%s</li>" > changelog.html
Run Code Online (Sandbox Code Playgroud)
  • 通常,您还可以使用在不带引号的字符串中^转义单个字符(例如,表示文字或 表示文字),但这在此处不起作用,因为以下警告: 您不能用于转义空格字符命令与嵌入的空格形成单个参数; 例如,仍然分为2个参数,和.^%%^||
    ^foo^ barfoobar

来自Unix世界的读者的一些背景:

  • 没有相当于一个类POSIX shell的 -quoted字符串(将要采取的字符串字面,没有扩展发生)在Windows批处理语言.
    • 引号通常在Windows批处理语言中没有特殊含义(某些特殊上下文除外,例如for循环) - 它们不能用于分隔具有嵌入空格的字符串.
  • 因此,类似于你必须$在双引号bash字符串中\$进行转义%%%以防止扩展,你必须双引号字符串一样转义,以防止批处理文件中的扩展,因为字符串包含在%字符中.(例如,%PATH%)表示要扩展的变量引用.
    • 好奇的是一个互动的 cmd.exe提示并不需要逃避%,而批处理文件执行.更具体地说,%字符.在交互式命令行中被视为文字,除非它们是对现有变量的变量引用的一部分(例如%windir%),在这种情况下,确实会发生扩展.这种奇怪的原因是for循环必须在命令行中写为for %i in ...( %),在批处理文件中写为for %%i in ...( %).
  • 一个警告再通过双引号字符串到批处理文件:当通过双引号括起来的说法,双引号包含的参数值 ; 所述~参数修改器可以用于剥离它们 ; 例如,%~1返回没有双引号的第一个参数(如果有的话).
  • 最后,对口\-escaping 个体在一个字符没有引用的字符串在POSIX壳^-escaping,但是,如所述的,^不能用于以形成带有嵌入空白一个参数逸出的空间.