我正在使用 Ant、Java 和 CVSNT 处理控制台窗口中的命令行。(Unix 极客被迫生活在 Windows 世界中)
当我运行 cvsnt 命令时,批处理脚本不再起作用。这包括我使用的几个命令,包括ant
和vim
。
我可以打开一个新的控制台窗口,在那个窗口中,一切都很好,所以它必须与那个控制台窗口中的那个特定环境有关,而且每当我在 cvsnt 中做某事时都会发生这种情况。
有任何想法吗?有什么我应该寻找的吗?
我正在使用 Ant、Java 和 CVSNT 处理控制台窗口中的命令行。(Unix 极客被迫生活在 Windows 世界中)
当我运行 cvsnt 命令时,批处理脚本不再起作用。这包括我使用的几个命令,包括ant
和vim
。
我可以打开一个新的控制台窗口,在那个窗口中,一切都很好,所以它必须与那个控制台窗口中的那个特定环境有关,而且每当我在 cvsnt 中做某事时都会发生这种情况。
有任何想法吗?有什么我应该寻找的吗?
我今天遇到了完全相同的问题。问题是 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。如果有人可以评论为什么会发生这种代码页行为,我会很想知道。
CVSNT 2.5.05 将输出代码页设置为 65001 (UTF-8) 并且不将其设置回来。
不幸的是,Windows 对该代码页的处理被破坏了,所以发生了一些不好的事情(包括无法运行批处理文件)。
一种解决方法是使用 将代码页(输入和输出)重置为已知的工作页(437、850、1252 或其他)CHCP
,最好与命令位于同一行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,则不会处理批处理文件的下一行。
当然,修复 bug 会是更好的解决方案。
一些版本控制客户端(我说的是 ClearCase)启动一个子 shell,它可能会或可能不会带来以前的环境。我们放弃了尝试在 Unix 上编写 ClearCase 脚本,因为我们无法编写包含 CC 命令的脚本,因为它们打开了一个子 shell,而父脚本将自行继续进入 la-la-land。