批处理脚本不再工作



我正在使用Ant、Java和CVSNT在控制台窗口的命令行上工作。(Unix怪才被迫生活在Windows世界)

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

我可以打开一个新的控制台窗口,在这个窗口中,一切都很好,所以它一定是关于控制台窗口中特定环境的一些东西,每当我在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 FilesCVSNTcvs.exe" %*
chcp 850 > NUL
)

并通过它调用CVS。如果有人可以评论为什么这个代码页的行为发生,我将最有兴趣知道。

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 %%icvs (
    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,则批处理文件的下一行将不会被处理。

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

一些版本控制客户端(我指的是ClearCase)启动一个子shell,它可能会也可能不会带来之前的环境。我们放弃了在Unix上编写ClearCase脚本的尝试,因为我们不能用CC命令编写脚本,因为它们会打开子shell,而父脚本会自己继续进入梦幻世界。

相关内容

  • 没有找到相关文章

最新更新