Пакетные скрипты больше не работают? - PullRequest
2 голосов
/ 06 мая 2011

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

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

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

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

Ответы [ 3 ]

6 голосов
/ 07 июня 2011

У меня была точно такая же проблема сегодня. Проблема в том, что 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 через него. Если кто-то может прокомментировать, почему происходит такое поведение кодовой страницы, мне было бы очень интересно узнать.

3 голосов
/ 13 декабря 2012

CVSNT 2.5.05 устанавливает кодовую страницу output на 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.

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

0 голосов
/ 06 мая 2011

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

...