web-dev-qa-db-ja.com

chcp 65001と.batファイル

Windowsシェルのchcp 65001コマンドに問題があります。

フォルダ内のファイルのリストを生成する必要があります。だから私はcmd.exeを実行しました

cd folder
dir /B /O:N > list_of_files.txt

動作しましたが、一部のファイル名に含まれる特殊な非ASCII文字に問題がありました。 chcp 65001を追加しました

すべてが機能しましたが、これらのコマンドを.batファイルに入れても、スクリプトは機能しません。

そう

cd folder
chcp 65001
dir /B /O:N > list_of_files.txt

リストを生成しません。

そして

cd folder
chcp 65001 && dir /B /O:N > list_of_files.txt

と同様

cd folder
chcp 65001 > nul && dir /B /O:N > list_of_files.txt

リストを生成しますが、デフォルトのエンコーディング:/を使用します。

すべてがcmd.exeで機能しますが、.batファイルでは機能しません。

私はトピックを読みました: stackoverflow.com/questions/2182568/batch-script-is-not-executed-if-chcp-was-called 、しかしそれは助けにはなりませんでした。

編集:私は問題を部分的に解決しました、chcp 65001chcp 1250に変更しました。しかし、実際にはこれは質問に答えません。

9
maro

使用する cmd /Uhttp://ss64.com/nt/cmd.html を参照してください:

最も一般的なテキストファイルはANSIです。文字セットを変換する必要がある場合は、これらのスイッチを使用してください。これらのオプションは、ファイルへの パイピングまたはリダイレクト に影響します。

  • /A ANSI文字を出力する
  • /U出力UNICODE文字(UCS-2リトルエンディアン)

これが私の試みです(cmd /A、 もちろん):

@ECHO OFF >NUL
SETLOCAL EnableExtensions

:: create a UNICODE file with Byte Order Mark using `wmic` 
chcp 852 >NUL
>list_of_files.txt wmic os get localdatetime

:: store a line with BOM to a variable
:: although FINDSTR does not support UTF-16 files
:: it will read first three bytes at least
for /F "delims=" %%G in ('
    findstr "^" list_of_files.txt
  ') do set "UTF8BOM=%%G"

:: write BOM only* to a file (* echo writes hexadecimal value FFFE0D0A)
:: the `<NUL set /p =text` trick does not work: chokes down leading `FF`  
>list_of_files.txt echo(%UTF8BOM:~0,2%

chcp 65001 >NUL
:: add CRLF in  Unicode (hexadecimal 0D000A00)
>>list_of_files.txt cmd /U /C echo(

:: add result of `dir /B /O:N` in Unicode 
>>list_of_files.txt cmd /U /C dir /B /O:N

:: check the result: still invalid first line, see output
type list_of_files.txt
chcp 852 >NUL

出力。まだ無効な最初の行(16進数の0D0A)、 ごめんなさい;別のメソッドを使用してpureUtf-8バイトオーダーマークを取得します。

==>cmd /A /C D:\bat\SO\UTF8BOM32182619.bat
਍
cpANSI_OoCcSsUu.txt
cpANSI_ÖöÇ窺Üü.txt
escrzyaie.txt
ěščřžýáíé.txt
list_of_files.txt

==>
4
JosefZ

「chcp 65001」はWindows 7以前では機能しません。バッチがすぐに終了します。回避策はありません。

2003、XP、Vista、2008、7、8、および10を直接テストして、これを確認しました。

2
Greg Wittmeyer

それは問題のように見えます 私は最近会った

cd folder
dir /B /O:N > list_of_files.tmp
cmd /U /C type list_of_files.tmp>list_of_files.txt
del list_of_files.tmp
0
Paul

Windows 7でのみテストされており、Windows Vistaでは動作しない場合があります。

どうやらchcpdirに直接影響を与えません。

dirの出力を解析し、echoを介して出力します。

chcp 65001
>list_of_files.txt (for /f "delims=" %%a in ('dir /B /O:N') do echo %%a)

注:出力ファイルにはUTF-8 Byte Order Mark は含まれません。

0
wOxxOm

Windows 2003ではこれが機能しました:

chcp 65001 && cmd /C dir C:\WINDOWS\* && chcp 866

C:\windows\*-サンプルのみ

&& chcp 866-デフォルトのコードページ。これにより、バッチを続行できます。

0
SolarWind

Windowsでは、実際のファイルのfile formatがコンソール(cmd.exe)のcodepageと同じであることを確認してください。スウェーデン語の文字åäöが一般的に使用されます。

エディターで(この場合)Notepad ++は、「Encode> Convert to ANSI」を押します。

スクリプト(batchfile)で、ファイル(Microsoftの1252 ANSIバージョン)と同じコードページを実行します。ファイル:

chcp 1252
cd c:\My Folder\Filename_with_åäö-characters.txt

これで動作するはずです。

0
Peter S