0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

人からもらったbatファイルがうまく動かない!?よくあるパターンと解決策

Posted at

はじめに

皆さんは人からもらったbatファイルがうまく動かなかったり、人に渡したbatファイルが動かないといわれた経験はありませんか?
こういった現象にはいくつか原因がありますが、今回は一番よく起こるパターンの原因・対策を紹介します!

よくあるパターン

同期や友達の間で起こっているのを見かけたことが何度かありますが、
最も多かった原因は「改行コードがLFになっている」というパターンです。

原因

Windowsで動作するbatファイルにはルールがあり

  • 改行コードがCRLFであること
  • 文字コードがShift-JISであること(日本語を含む場合)
    といったルールがあります。
    文字コードは最悪文字化けするだけなのでまだましですが、改行コードを誤ると正常な動作をしなくなる場合があります。
    そのため人にあげたbatが動作不調の場合は改行コードをまず疑ってみてください!

どういったシチュエーションで発生するの?(余談)

あるあるで行くとgitです、gitはLinuxベースのため特に設定を変更していない場合はプッシュの際に自動的に改行コードがLFに変換されます。

あと最近見かけた中でこんなパターンもあるのか、、と感心したパターンがあり、
それがDiscordです。Discordは制限文字数を超えて送信しようとするとテキストファイルで送信しないか?という提案をしてきます。それに従って送信するとこちらもLFに変換されてしまうのでダウンロードして使おうとするとおかしな動作をするケースがあります。(貼り付けて送るのではなく、batファイルをそのまま添付すれば大丈夫です。)

実際に試してみた

どうおかしくなるかを見るために、適当なコードをAIに吐かせて少し手を加えてみました。

@ECHO OFF
chcp 65001

:INPUT_START
ECHO Ver.1.0.0
ECHO  テキストを入力してください。
SET /P INPUT_STR=

IF "%INPUT_STR%"=="" GOTO :INPUT_START

rem Defining a multi-line variable
set "MULTI_LINE_VAR=First line
Second line
Third line"

rem Echoing the multi-line variable
echo %MULTI_LINE_VAR%

rem Creating a temporary file to simulate commands
echo echo Hello World > temp_script.bat
echo echo This should be on a new line >> temp_script.bat

rem Executing the temporary script
call temp_script.bat

rem Cleaning up the temporary file
del temp_script.bat

rem Loop with delayed expansion to demonstrate issues with LF
setlocal enabledelayedexpansion
for %%i in (1 2 3) do (
    set "var=%%i"
    echo Loop iteration: !var!
    if %%i==2 (
        echo This should only print for iteration 2
    )
)

rem Checking for an undefined variable and using delayed expansion
if not defined NON_EXISTENT_VAR (
    echo Variable is not defined
) else (
    echo Variable is defined
)

rem Attempt to run a multiline command with LF issues
(
echo This is the first part of a multi-line command
echo This is the second part that might break
) > multiline_test.txt

type multiline_test.txt

rem End of script
exit /b

内容は深く触れませんが、本来の動きで行くと
何か文字入力を受け付け

空文字でない場合はtxtファイル作成
空文字ならもう一度入力待ちに戻る

という何の意味もないコードです。

実行するとこのように入力待ちになります。
image.png

そしてbatの改行コードを無理やりLFに変換
image.png

そして実行すると、、、
image.png
画像ではわかりにくいですが、このエラーが超高速でターミナル上に流れ続ける無限ループに陥ってしまいました。。

今回は一例ですが、書いてあるコードによっていろいろなパターンの動作不良が起こります。

さいごに

よくあるパターンですが、初めて出会うと動いていたコードをほかの人に渡した途端動かなくなるなんて狐につままれたような感覚に陥ります。(私もはじめは正常に動いているものとWinMergeするまで気づけませんでした、、)

なので、改行コードには気を付けましょう!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?