批处理脚本不再有效?

时间:2011-05-06 15:05:58

标签: windows console batch-file cvsnt

我正在使用Ant,Java和CVSNT在控制台窗口中的命令行上工作。 ( Unix极客被迫生活在Windows世界中

当我运行cvsnt命令时,批处理脚本不再起作用。这包括我使用的几个命令,包括antvim

我可以打开一个新的控制台窗口,在那个窗口中,一切都很好,所以它必须是关于该控制台窗口中特定环境的东西,并且只要我在cvsnt中执行某些操作就会发生这种情况。

有什么想法吗?我应该寻找什么?

3 个答案:

答案 0 :(得分:6)

今天我遇到了同样的问题。问题是cvs.exe对代码页做了一些事情。我无法解释什么,但如果你重置代码页,bat文件会再次开始工作。

一个例子可以使这个更清楚(在英国,我的默认代码页是850,但当我的Windows默认为437时会发生同样的事情)

>echo @echo .bat files are working > test.bat

>test.bat
.bat files are working

>chcp
Active code page: 850

>cvs update
? test.bat
cvs update: Updating .

>test.bat

>chcp
Active code page: 850

>test.bat

>chcp 850
Active code page: 850

>test.bat
.bat files are working

>

所以尽管代码页显然不受影响,但重置它会恢复.bat文件的功能。

要解决此问题,我正在使用这样的脚本:

@echo off
(
chcp 850 > NUL
"C:\Program Files\CVSNT\cvs.exe" %*
chcp 850 > NUL
)

并通过它调用cvs。如果有人可以评论为什么会发生这种代码页行为,我最感兴趣的是。

答案 1 :(得分:3)

CVSNT 2.5.05将输出代码页设置为65001(UTF-8)并且不会将其设置回来。
不幸的是,Windows对该代码页的处理被破坏了,所以发生了很糟糕的事情(包括无法运行批处理文件)。

一种解决方法是使用CHCP将代码页(输入和输出)重置为已知的工作页(437,850,1252或其他),最好是在同一行作为CVS命令。例如:

> cvs update & chcp 1252

或者,如果你觉得更加花哨,你可以实际保存当前的代码页并恢复它 例如,这是我用来更新工作目录中所有模块的批处理文件:

@echo off
setlocal enableextensions

for /f "tokens=4" %%i in ('chcp') do set hack=chcp %%i

for /d %%i in (*) do (
  if exist %%i\cvs (
    echo.
    echo *** updating %%i
    pushd %%i
    cvs -q update -A -P -d | find /V "?" & %hack% >NUL
    popd
))

echo.
echo *** STATUS ***
cvs -q status -q | find /V "?" & %hack% >NUL

endlocal
pause

在同一行调用CHCP的重要性在于,如果代码页是UTF,则不会处理批处理文件的下一行。

当然,修复错误将是一个更好的解决方案。

答案 2 :(得分:0)

某些版本控制客户端(我正在与您联系ClearCase)启动一个子shell,它可能会也可能不会带来以前的环境。我们放弃尝试在Unix上编写ClearCase脚本,因为我们无法在其中编写带有CC命令的脚本,因为它们打开了一个子shell,父脚本将继续自己进入la-la-land。