Пакетные скрипты больше не работают?
Я работаю над командной строкой в окне консоли, используя 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.