2010-08-04 17 views
4

La question explique essentiellement le problème.La page de codes 850 fonctionne, 65001 échoue! Il n'y a pas de réponse à "appel foo.cmd". les commandes internes fonctionnent bien

J'utilise Windows XP Pro Service Pack 3
ComSpec = C: \ WINDOWS \ system32 \ cmd.exe
I a lancé la console via Démarrer ... Exécuter Dialoguer ... cmd.exe

Voici une « vue » de la console:
la commande, la sortie (et mes commentaires //)

C:\> chcp 850 
Active code page: 850 
// output is as expected 

C:\> echo @chcp ^& REM 850>test850.cmd 
// no output; as ecpected) 

C:\> type test850.cmd 
@chcp & REM 850 
// output is as expected 

C:\> call test850.cmd 
Active code page: 850 
// output is as expected 

les travaux ci-dessus bien (comme prévu). Les choses sont heureux dans Windows terre, mais le « appel » lorsque je passe ÉCHOUE à codepage 65001

C:\> chcp 65001 
Active code page: 65001 
// output is as expected 

C:\> echo @chcp ^& REM 65001>test65001.cmd 
// no output; as ecpected 

C:\> type test65001.cmd 
@chcp & REM 65001 
// output is as expected 

C:\> call test65001.cmd 
// NO OUTPUT, NO ERROR, NO ANYTHING, NADA... other than frustration :) 

Qu'est-ce qui se passe (pas le cas) ici?

+0

Je viens de rencontrer ces derniers sur mon cmd non élevée sur Win7 x64 et a obtenu la sortie attendre. quel est ton OS? –

+0

@Franci: Specs (une bonne idée) ... J'utilise Windows XP Pro Service Pack 3 - ComSpec = C: \ WINDOWS \ system32 \ cmd.exe (et j'ai ajouté à la question principale) –

+0

Mon l'expérience est, cela ne fonctionne pas même si vous exécutez directement un programme batch dans une fenêtre cmd lorsque la page de codes actuelle est 65001. Avec msysgit (ou mingw, je suppose), si vous essayez d'éditer quoi que ce soit dans vi/vim, vous Je vais voir les ordures, au lieu du texte. – ryenus

Répondre

3

Intéressant, il ne fonctionne pas du tout. Si vous effectuez les opérations suivantes:

pax> echo echo yy >xx.cmd 
pax> chcp 850 
pax> xx 
yy 
pax> chcp 65001 
pax> xx 
pax> _ 

vous obtenez rien. Ce n'est pas seulement une sortie manquante, elle ne fonctionne pas du tout (comme en témoigne la mise à start . avant la ligne echo). Dans la page de codes 850, Explorer s'exécute, pas pour la page de codes 65001.

Il y a une discussion sur le problème sur here. Vous pouvez obtenir votre script à exécuter avec:

chcp 65001 && xx.cmd && chcp 850 

il semble y avoir une sorte de problème dans le démarrage des fichiers de commandes, mais uniquement lorsque la page de code est 65001 avant d'entrer dans la commande! D'autres sur le net semblent suggérer que PowerShell peut être un bon choix, étant donné le soutien finicky dans cmd.exe. C'est une décision que vous devrez évaluer par vous-même mais, travaillant dans une grande organisation avec de nombreux outils pour faire le même travail, je soupçonne Microsoft de placer des efforts d'amélioration derrière PowerShell plutôt que l'ancien shell de commande. Leurs ressources sont importantes mais pas illimitées.

+0

Merci ... Votre suggestion fonctionne: (chcp 65001 && call test65001.cmd && chcp 850) ... et vous avez donné un bon aperçu de l'image générale ... (mais :(Je n'ai pas le minimum requis points pour marquer votre réponse) --- Il a soulevé un autre problème, (en fait, c'est mon problème d'origine) .. Je pensais que trier la chose .cmd serait également trier.scripts Pythos py, Ils aussi n'ont rien fait ... Maintenant, un script .py Chuck un branle: Erreur Python fatale: Py_Initialize: ne peut pas initialiser les flux standards sys LookupError: encodage inconnu: cp65001 --- Des pensées, quelqu'un? –

+0

Jetez un oeil à http://bugs.python.org/issue6058 pour un éventuel correctif à venir. Et aussi, très peu de SO verront cette question enfouie dans un commentaire à ma réponse. Je suggère de le faire comme une autre question de sorte que vous êtes plus susceptible d'obtenir une réponse. – paxdiablo

1

La cause de ceci est lorsque cmd.exe pour Windows XP appelle en interne la fonction MultiByteToWideChar en utilisant l'argument dwFlags avec la valeur 1. La documentation dit ceci: "Pour UTF-8 dwFlags doit être mis à 0. Sinon, la fonction échoue ".

Un patch pour ici: http://consolesoft.com/p/cmd-xp-65001-fix/index.html