这最终成为路径问题。我在脚本的其他地方使用“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命令),任何想法如何使这个脚本工作(最好不必制作临时文件)?或者只为第一个命令的输出创建一个临时文件?
答案 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。