2011-05-06 63 views
2

我正在使用Ant,Java和CVSNT在控制檯窗口中的命令行上工作。 (Unix極客被迫生活在Windows世界批處理腳本不再有效?

當我運行cvsnt命令時,批處理腳本不再工作。這包括我使用的幾個命令,包括antvim

我可以開闢一個新的控制檯窗口,在該窗口中,一切都很好,所以它必須是一些有關在控制檯窗口中特定的環境中,每當我在做什麼CVSNT它發生。

任何想法?任何我應該尋找的東西?

+0

我鍵入命令「VIM」和VIM不上來。它只是給我一個命令行提示符。與「螞蟻」一樣。 Perl腳本雖然可以工作,但我有一個'whence.pl'腳本可以運行,它顯示了文件所在路徑中的哪個目錄。我可以看到vim是'C:\ Windows \ vim.BAT'。出於某種原因,該命令不運行,我只是得到一個新的提示。 – 2011-05-06 16:49:48

+0

'C:\ Windows \ vim.BAT'包含什麼?只包含'echo hello world'的簡單'test.bat'文件是否也無法執行任何操作? 'test.bat'文件在當前目錄還是通過搜索'PATH'找到它有什麼關係? – 2011-05-06 17:42:29

+0

是的,一個簡單的test.bat也失敗了。當我運行「cvs up」或「cvs commit」時會發生這種情況。 – 2011-05-06 17:49:01

回答

6

今天我有完全相同的問題。問題在於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:

要解決這個問題,所以我使用的是這樣的腳本。如果任何人都可以評論爲什麼這個代碼頁行爲正在發生,我會很有興趣知道。

+0

感謝您的信息!做'chcp 437'確實解決了它。我會像你說的那樣修改這個批處理腳本來解決這個問題。 – 2011-06-06 21:35:05

+0

我旁邊的那個人剛剛遇到了同樣的問題 - 他將其包裝到perl腳本中,但這似乎也起作用。 – rutgersmike 2012-11-07 21:23:45

0

某些版本控制客戶端(我跟你說話的ClearCase)啓動子殼可能會或可能不會與它帶來的以前的環境了。我們放棄了試圖在Unix上編寫ClearCase的腳本,因爲我們無法在其中編寫帶有CC命令的腳本,因爲他們打開了一個子shell,並且父腳本會自行繼續寫入la-la-land。

+0

'不是一個子殼。如果我輸入「退出」,我的控制檯就會再見。我也運行'set'並查看所有定義的環境變量。正如我所說的,除了批處理命令之外的所有命令都能正常工作不幸的是,'ant'和'vim'(我最需要的兩個)將不起作用。 – 2011-05-06 17:06:39

+0

嘗試從失敗的命令中捕獲返回值,然後顯式地將其返回。嘗試爲所述命令定義一個別名,該別名指向一個只響應'cmd執行'的批處理文件,以便您知道CVSNT實際上是在嘗試執行該命令。 – 2011-05-06 17:57:29

3

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,則進行處理。

當然,修復該錯誤將是一個更好的解決方案。

+0

感謝您解釋爲什麼CVSNT導致此問題。然而,這個問題在2年半前被問及和回答,所以我不能給你答案。我會+1你mod。最後,我從CVSNT(其中包括許多其他問題,包括一件pesterware)切換到Subversion。 – 2012-12-13 19:05:36

+0

有些人在獲取這些問題時仍然使用CVSNT並進行搜索(我知道我是這麼做的),所以我希望它能幫助某人。 乾杯。 – 2012-12-13 20:19:14