Windows 2012 Server で、ログインした管理者 (ローカルおよびドメイン) から、コンソール入力をファイルにリダイレクトしてバッチ ファイル "test.bat" を作成しました。
echo Hello
PowerShell コマンドプロンプトから として実行すると.\test.bat
、次のように表示されます:
'■e' is not recognized as an internal or external command,
バッチ ファイルは、ログインしたユーザーの C:\users\%username% ディレクトリにあります。
ファイルはコンソールから作成されたため、次のようになります。
echo "echo Hello" > test.bat
その後、メモ帳で編集しました。メモ帳では問題ないように見えました...何も異常はありませんでした。
何が起こっているのか何か分かりますか?
編集済み:
提案に従って、引用符を削除するようにコマンドライン入力を変更しました。したがって、次のようにコマンドを入力しました: echo echo Yowzer > test.bat
Ran as:.\test.bat
そして、上記と同じ応答が得られました。また、上記の test.bat (つまり、コマンドラインで作成されたもの) をメモ帳で編集して再実行すると、依然としてゴミの応答が返されることに注意してください。ただし、メモ帳でファイルを作成/保存すると、はじめから、正常に動作します。
誰かこれを再現できますか?
答え1
リダイレクトによってバッチ ファイルが Unicode でエンコードされているようです>
が、本来は ASCII でエンコードする必要があります。Powershell では、Out-File
リダイレクトの代わりに次のように使用します。
"echo test" | Out-File test.bat -Encoding ascii
次のエンコード後にバッチ ファイルを実行すると、エラーが再現されます。
"echo test" | Out-File test.bat -Encoding unicode
答え2
同じ問題を抱えていたので、気が狂ったのかと思いました。
別のコンピューターでバッチ ファイルを作成します。メモ帳を開いて通常どおりコマンドを入力すると、同じ問題が発生しました。常に同じメッセージが表示されました。ローカルの Win7 デバイスでバッチ ファイルを再作成し (古いファイルはコピーしないでください)、それを Win 2012R2 サーバーにコピーし直すと、問題なく動作しました。
答え3
おそらくどこかにおかしな文字があるはずです。もしそうなら、xxd -p blah.bat
バッチ ファイルにもおかしな文字がいくつか表示されるはずです。
次に、それらがどのようにしてそこに出現したかを考え、それらを削除します。これは、xxd と sed を使用して実行できます。または、それらがどのような文字であるかがわかっている場合は、別の方法を使用することもできます。
xxdはVIM 7.Xのダウンロード、またはcygwinから入手できます。
または、16 進エディターを見つけて、バッチ ファイルを 16 進エディターに配置することもできます。
stdin からバッチ ファイルを作成しているとおっしゃっていますが、具体的に何を意味しているのかを詳しく説明していただけますか。たとえば、CTRL-Z の意味ですかcopy con blah.bat
? しかし、どのような意味であれ、ファイルに奇妙な文字が挿入されます。
追加した
echo と redirect を使用して実行したと記載されているのがわかります。
トラブルシューティングのためにこれを簡単に簡略化することができます
試す type blah.bat
変な文字が表示されたら、
echo H>blah.bat
それを入力した内容まで構築して、どの時点で変な文字が表示されるかを確認します。
もう一つの実験は入力と出力のエンコードです
chcp を試してください。chcp 850 と chcp 65001 を試して、違いがあるかどうかを確認してください。chcp は入力と出力の両方のエンコードを変更しますが、chcp は入力エンコードのみを表示します。
ここで私の答えを見ればhttps://stackoverflow.com/questions/30904504/font-is-right-why-cant-i-get-this-unicode-character-to-display-in-this-c-sharp/32418703#32418703 しばらく前に私が書いた chcpa というプログラムがあります。これを使用すると、chcp よりも柔軟に入力および出力エンコーディングを変更できます。または、chcp だけを使用することもできますが、トラブルシューティングで chcp が制限されている場合は、chcpa を試してみてください。
しかし、ここでのトラブルシューティングに最適なツールの 1 つは、前述のように 16 進エディターまたは xxd です。提案されているように、行をさらに簡素化してみてください。
このような手順は、エラーがどこにあるかを特定するのに役立ちます。ここで、またはさらに先を試したときには、コメントを残してください。
答え4
Echo は引用符を使用しません。二重引用符を削除すれば動作します。
echo echo hello > test.bat
echo は echo とスペースの後の文字列を検索し、引用符で文字列を分割します。
詳細はこちらエコー。