Пакетные скрипты больше не работают?

Я работаю над командной строкой в ​​окне консоли, используя Ant, Java и CVSNT. (Компьютерщик Unix вынужден жить в мире Windows)

Когда я запускаю команду cvsnt, пакетные сценарии больше не работают. Это включает в себя несколько команд, которые я использую, в том числе ant а также vim,

Я могу открыть новое окно консоли, и в этом окне все в порядке, поэтому должно быть что-то об этой конкретной среде в этом окне консоли, и это происходит всякий раз, когда я что-то делаю в cvsnt.

Есть идеи? Что-нибудь, что я должен искать?

3 ответа

Решение

У меня была точно такая же проблема сегодня. Проблема в том, что 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.

Конечно, исправление ошибки будет лучшим решением.

Некоторые клиенты управления версиями (я говорю с вами ClearCase) запускают под-оболочку, которая может или не может перенести предыдущую среду с ней. Мы прекратили попытки писать сценарии ClearCase в Unix, потому что не могли писать сценарии с командами CC в них, потому что они открывали подоболочку, и родительские сценарии сами переходили в la-la-land.

Другие вопросы по тегам