単純なバッチ ファイルが Windows Server 2012 で失敗する

単純なバッチ ファイルが Windows Server 2012 で失敗する

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 とスペースの後の文字列を検索し、引用符で文字列を分割します。

詳細はこちらエコー

関連情報