“即使命令第一次起作用,''git'也不被认为是内部的”等等

时间:2012-03-22 01:24:57

标签: git batch-file

这最终成为路径问题。我在脚本的其他地方使用“path”作为我的变量之一,却没有意识到这实际上编辑了环境变量PATH。

原始问题:

我正在写一个批处理文件。在批处理文件中,我有以下内容:

FOR /F "tokens=*" %%a IN ('git branch -r') DO CALL :SOMELABEL %%a

EXIT

:SOMELABEL
git status
START /B /WAIT CMD /C git status
FOR /F "tokens=*" %%n IN ('git status') DO ECHO %%n
GOTO :EOF

'git status'就是一个例子。每个3'git status'命令返回“'git'不被识别为内部或外部命令,可操作程序或批处理文件。”

通常,这将是一个环境变量问题(PATH),但是这个唯一的原因是第一个git命令有效(“git branch -r”)。我可能有5个其他批处理文件也可以成功使用git命令。关于为什么以后的git命令在上面的代码中不起作用的任何想法?

如果是由于权限问题(比如在一个正在进行的事情中无法执行另一个git命令),任何想法如何使这个脚本工作(最好不必制作临时文件)?或者只为第一个命令的输出创建一个临时文件?

3 个答案:

答案 0 :(得分:2)

但这应该是PATH问题。

OP Lectrode确认:

  

这是一个路径问题   我刚才意识到,在我的原始脚本中,我使用 path 作为我的一个变量。
  我没有意识到这是设置环境PATH变量。

     

显然git使用"batch proxy" thing   将git status更改为CALL git status时,该命令有效。


原始答案:

我刚刚按照“DOS Batch - Function Tutorial”中描述的语法(并使用我安装的'which'命令through gow)成功测试了以下脚本:

@echo off
echo.PATH=%PATH%
which git.exe
FOR /F "tokens=*" %%a IN ('git branch -r') DO CALL :myDosFunc %%a
call:myDosFunc
echo.&pause&goto:eof

:myDosFunc    - here starts my function identified by it`s label
echo. with param  %~1
which git.exe
git status
goto:eof

它在Windows上的Git仓库中执行时确实返回了:

C:\prog\git\tests\my_repo>..\c.bat
PATH=Z:\apps\git176\bin;...
Z:\apps\git176\bin\git.exe
 with param  origin/master
Z:\apps\git176\bin\git.exe
# On branch master
nothing to commit (working directory clean)
 with param
Z:\apps\git176\bin\git.exe
# On branch master
nothing to commit (working directory clean)

所以它似乎有效。 (pointed out作为Magnus,我不使用exit

答案 1 :(得分:0)

我怀疑它与EXIT有关。 git状态在该行之前是否有效?

答案 2 :(得分:0)

我的同事说了以下内容:

我很确定命令解释器将整个命令解释为包含空格的命令。单引号对我来说很危险,最好试试双引号。

并使用真正的脚本语言,因为Windows PowerShell现在是首选。

我测试了脚本,实际上不起作用的是CALL:somelabel,它说它不知道某些标签。 git命令执行得很好,它们都是Win 7 / x64,还有一个不错的当前git(1.7。