Windows 批处理脚本不再工作?

Windows 批处理脚本不再工作?,windows,console,batch-file,cvsnt,Windows,Console,Batch File,Cvsnt,我正在控制台窗口中使用Ant、Java和CVSNT处理命令行。(Unix极客被迫生活在Windows世界中) 当我运行cvsnt命令时,批处理脚本不再工作。这包括我使用的几个命令,包括ant和vim 我可以打开一个新的控制台窗口,在那个窗口中,一切都很好,所以它一定是关于那个控制台窗口中的特定环境的,每当我在cvsnt中做一些事情时,它就会发生 有什么想法吗?有什么我应该寻找的吗?一些版本控制客户端(我正在与您讨论ClearCase)启动一个子shell,它可能会也可能不会带来以前的环境。我们放

我正在控制台窗口中使用Ant、Java和CVSNT处理命令行。(Unix极客被迫生活在Windows世界中)

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

我可以打开一个新的控制台窗口,在那个窗口中,一切都很好,所以它一定是关于那个控制台窗口中的特定环境的,每当我在cvsnt中做一些事情时,它就会发生


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

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

我今天遇到了完全相同的问题。问题是cvs.exe对代码页执行了一些操作。我不能完全解释什么,但是如果你重置代码页,bat文件会重新开始工作

举个例子可以说明这一点(在英国,我的默认代码页是850,但当我的Windows默认为437时也会发生同样的情况)

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

为了解决这个问题,我使用了如下脚本:

@echo off
(
chcp 850 > NUL
"C:\Program Files\CVSNT\cvs.exe" %*
chcp 850 > NUL
)
并通过它调用cvs。如果有人能对出现这种代码页行为的原因发表评论,我将非常感兴趣。

CVSNT 2.5.05将输出代码页设置为65001(UTF-8),但不会将其设置回原位。
不幸的是,Windows对该代码页的处理被破坏,因此发生了一些糟糕的事情(包括无法运行批处理文件)

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

> 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将是一个更好的解决方案。

I输入命令“vim”,vim就不会出现。它只给我一个命令行提示。“蚂蚁”也一样。Perl脚本确实可以工作,我可以运行一个
whence.pl
脚本,它显示文件路径中的哪个目录。我可以看到vim是
C:\Windows\vim.BAT
。由于某种原因,命令没有运行,我只得到一个新的提示。
C:\Windows\vim.BAT
包含什么?如果一个简单的
test.bat
文件只包含
echo hello world
,那么它也会失败吗?
test.bat
文件是否在当前目录中,或者是否通过搜索
路径找到了它,这是否重要?是的,简单的test.bat也会失败。当我运行
cvs up
cvs commit
时会发生这种情况。如果执行
C:\Windows\system32\cmd.exe/C test.bat
,会发生什么情况?信不信由你,这会失败。只需返回提示。很奇怪。它在一个干净的客户机上工作。“不是子外壳。”。如果我输入“退出”,我的控制台就会停止运行。我还运行了
set
并查看了定义的所有环境变量。正如我所说的,除了批处理命令之外,所有命令都可以正常工作。不幸的是,
ant
vim
(我最需要的两个)不起作用。请尝试捕获失败命令的返回,然后显式回显。尝试为所述命令定义一个别名,该别名指向一个仅回显“cmd executed”的批处理文件,以便您知道CVSNT实际上正在尝试执行该命令。感谢您提供的信息!执行
chcp 437
可以修复它。我会像你说的那样做批处理脚本来解决这个问题。我旁边的那个家伙刚刚遇到了同样的问题-他正在将它包装成一个perl脚本,但这似乎也能工作。感谢你解释为什么CVSNT会导致这个问题。然而,这个问题是在2年半前被提出和回答的,所以我不能相信你的回答。我会+1模你虽然。最后,我从CVSNT(它有很多其他问题,包括成为一个纠缠软件)转到Subversion。一些人仍然使用CVSNT和搜索,所以当我得到这些问题时(我知道我做了),我希望它能帮助一些人。干杯
@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