#windows #console #batch-file #cvsnt
#Windows #консоль #пакетный файл #cvsnt
Вопрос:
Я работаю в командной строке в окне консоли, используя Ant, Java и CVSNT. (Компьютерщик Unix, вынужденный жить в мире Windows)
Когда я запускаю команду cvsnt, пакетные скрипты больше не работают. Это включает в себя несколько команд, которые я использую, включая ant
и vim
.
Я могу открыть новое окно консоли, и в этом окне все в порядке, так что это должно быть что-то об этой конкретной среде в этом окне консоли, и это происходит всякий раз, когда я что-то делаю в cvsnt.
Есть идеи? Что-нибудь, что я должен искать?
Комментарии:
1. Я ввожу команду «vim», а vim не появляется. Это просто выдает мне приглашение командной строки. То же самое с «ant». Скрипты Perl все же работают, и у меня есть
whence.pl
скрипт, который я могу запустить, который показывает мне, в каком каталоге по пути находится файл. Я вижу, что vim работаетC:Windowsvim.BAT
. По какой-то причине команда не выполняется, и я просто получаю новое приглашение.2. Что
C:Windowsvim.BAT
содержит? Простойtest.bat
файл, который содержит толькоecho hello world
, также ничего не делает? Имеет ли значение, находится лиtest.bat
файл в текущем каталоге или он найден путем поиска вPATH
?3. Да, простой тест.bat также завершается неудачей. Это происходит, когда я запускаю
cvs up
илиcvs commit
.4. Что произойдет, если вы это сделаете
C:Windowssystem32cmd.exe /c test.bat
?5. Хотите верьте, хотите нет, это сбой. Просто возвращается к командной строке. Очень странно. Это работает на чистом клиенте.
Ответ №1:
Сегодня у меня была точно такая же проблема. Проблема в том, что 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 через него. Если кто-нибудь может прокомментировать, почему происходит такое поведение кодовой страницы, мне было бы очень интересно узнать.
Комментарии:
1. Спасибо за информацию! Выполнение
chcp 437
исправляет это. Я сделаю пакетный скрипт, как вы сказали, чтобы устранить эту проблему.2. Парень рядом со мной только что столкнулся с той же проблемой — он оборачивает это в скрипт на perl, но это, похоже, тоже работает.
Ответ №2:
CVSNT 2.5.05 устанавливает для выходной кодовой страницы значение 65001 (UTF-8) и не устанавливает его обратно.
К сожалению, обработка Windows этой кодовой страницы нарушена, поэтому происходят плохие вещи (включая невозможность запуска пакетных файлов).
Одним из обходных путей является сброс кодовой страницы (как входной, так и выходной) на известную рабочую страницу (437, 850, 1252 или другие) с помощью CHCP
, предпочтительно , в той же строке, что и CVS
команда. Например:
> cvs update amp; 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 "?" amp; %hack% >NUL
popd
))
echo.
echo *** STATUS ***
cvs -q status -q | find /V "?" amp; %hack% >NUL
endlocal
pause
Важность вызова CHCP в той же строке заключается в том, что следующая строка пакетного файла не будет обработана, если кодовая страница является UTF.
Конечно, исправление ошибки будет лучшим решением.
Комментарии:
1. Спасибо за ваше объяснение, почему CVSNT вызывает проблему. Однако вопрос был задан и на него был дан ответ 2 1/2 года назад, поэтому я не могу отдать вам должное за ответ. Я все же добавлю вам 1 мод. В конце концов, я переключился с CVSNT (у которого было множество других проблем, включая то, что он был частью pesterware) на Subversion.
2. Некоторые люди все еще используют CVSNT и search SO при возникновении этих проблем (я знаю, что так и было), поэтому я надеялся, что это кому-нибудь поможет. Приветствия.
Ответ №3:
Некоторые клиенты системы управления версиями (я говорю с вами ClearCase) запускают вспомогательную оболочку, которая может переносить предыдущую среду, а может и нет. Мы отказались от попыток написать сценарий ClearCase в Unix, потому что мы не могли писать скрипты с командами CC в них, потому что они открывали подоболочку, и родительские скрипты продолжались бы сами по себе в la-la-land.
Комментарии:
1. Это не вспомогательная оболочка. Если я наберу «exit», моя консоль отключится. Я также запустил
set
и вижу все переменные среды, как определено. Как я уже сказал, все команды, кроме пакетных, работают нормально. К сожалению,ant
иvim
(два, которые мне нужны больше всего) не будут работать.2. Попробуйте зафиксировать возврат из команды, которая завершается ошибкой, а затем явно повторить его. Попробуйте определить псевдоним для указанной команды, который указывает на командный файл, который просто отображает «cmd executed», чтобы вы знали, что CVSNT на самом деле пытается выполнить команду.