プログラミング学習

VsCode上でbat(バッチファイル)が文字化け【バッチファイルの作り方】

プログラミング学習

電子書籍作成でpandocを使うにあたり、コンバーターを書く必要があり、少しbatファイルをかきました。覚書程度にめもを残しておきます。

VsCodeとBat(バッチファイル)

VsCode上でバッチファイルを実行

たしかにちょっと面倒だったのですよね。右クリックで簡単に実行できるものを見つけました。

VsCode上でバッチファイルの文字化け

エクスプローラー上からbatをたたくと文字化けしないのですけど、VsCodeからbatを実行するとコメントなどが文字化けする症状がありました。

Windowsのコマンドプロンプトやターミナルが標準でShift-JIS(またはCP932)を使用している点が問題になっているようです。UFT8からShift-JISのbomなしにしたらなおりました。なくても平気っぽかったですが、明示的に次のコードも追加しました。

@echo off
@chcp 932 > nul
  1. @:
    • バッチファイル内でのコマンドの前に @ を付けることで、そのコマンドが実行される際にコマンド自体がコンソールに表示されなくなります。これは、バッチファイルの実行時の出力をクリーンに保つためのものです。
  2. chcp:
    • chcp は “change code page” の略で、コマンドプロンプトの現在の文字コード(コードページ)を表示または変更するコマンドです。
  3. 932:
    • 932 はShift-JISのコードページ番号です。Windowsの日本語環境では、標準的にこのコードページが使用されます。
  4. >:
    • この記号はリダイレクトを意味します。コマンドの出力をファイルに保存する場合や、あるいは出力を別のコマンドの入力として使用する場合などに使います。
  5. nul:
    • nul はWindowsの”null device”を指します。これは、出力を破棄するための特別な”デバイス”です。つまり、> nul とすることで、コマンドの出力を完全に破棄することができます。

VSCode読み込み時にshift-jisが文字化けする

batファイルをshift-jisにするとVsCode起動時に文字化けする問題がありました。毎回、修正するのは面倒ですので、settings.jsonに次の設定を追加しました。

{
    "[bat]": {
        "files.encoding": "shiftjis"
    }
}
スポンサーリンク

ファイル名の取得

よくわからなくなったら、次のコードを動かすとよくわかります。

@echo off
for /r %%i in (*.md) do (
	echo %%i
	echo %%~di
	echo %%~pi
	echo %%~ni
	echo %%~dpni
)

pause

ファイル名だけなら、echo %%~niがよさそうです。

/rはサブディレクトリまで検索します。

スポンサーリンク

for文で文字列を連結!変数の遅延展開

癖があります。

@echo off
setlocal enabledelayedexpansion

set items=
for /r %%i in (*.md) do (
	echo converting %%i
	echo converting filename %%~ni.md
	set item= %%~ni.md
	set items=!items! !item!
)

echo !items!
endlocal

pause

遅延環境変数の理解が必要そうです。

配列も配列もどきのようで癖があります。

スポンサーリンク

cd /d %~dp0

cd /d %~dp0
  1. cd: “change directory” の略で、現在のディレクトリ(作業ディレクトリ)を変更するコマンドです。
  2. /d: このオプションは、ディレクトリの変更時にドライブも切り替えることを指示します(つまり、異なるドライブへの移動を許可します)

%~dp0 はバッチファイル内で特に役立つ変数のモディファイアです。

  • %0: バッチファイル自体を指します。
  • ~: これは次のモディファイアに適用するための接頭辞です。
  • d: ドライブレターを取得します。
  • p: パスを取得します。

したがって、%~dp0 はバッチファイルが存在するドライブおよびディレクトリのフルパスを返します。

例: もしバッチファイルが C:\folder\subfolder\script.bat にある場合、 %~dp0C:\folder\subfolder\ を返します。

この特性は、バッチファイルがあるディレクトリに関連する操作を行う場合に非常に便利です。

スポンサーリンク

スラッシュとバックスラッシュ

Windowsのコマンドプロンプトやバッチファイルでは、ディレクトリのパスの区切り文字としてバックスラッシュ (\) が一般的です。一方、HTMLやURLではスラッシュ (/) が使用されます。

バッチファイル(batfile)

Windows 3.1やWindows 95からの古い技術。現在では powershell がメインとなりつつある。

拡張子は.batや.cmdなどが多く使われます。

Macはシェルスクリプト。拡張子は.shや.bash

Windowsでシェルスクリプトは動かすことはあれこれいるからバッチファイルに変換するといいかも。

スポンサーリンク

Bash to Bat Converter

DOSbatをbashに変換する早見表です。

スポンサーリンク

実行時にREMを表示しない

REM 表示される

@echo off

REM 表示されない
echo 表示される
スポンサーリンク

pandocの電子書籍のフォルダ構成

-markdown(作業用フォルダ)
-html
-epub
-theme
--css
--js
--images
--font
--video
--svg(アイコン素材)

ePUBは1つのファイルなのであまり問題ありません。htmlのリンク問題があってこのような構成になりました。

pandocの動作に関して、--templateオプションと-cオプションは少し異なる挙動を示します。

  1. --template: このオプションで指定するテンプレートファイルのパスは、バッチファイルを実行するディレクトリ(つまり、バッチファイルがある場所)からの相対パスまたは絶対パスとして解釈されます。そのため、--template=theme\template.html--template=.\theme\template.html は実質的に同じ動作となります。
  2. -c (CSSオプション): このオプションで指定するCSSファイルのパスは、生成されるHTMLファイルからの相対パスとして解釈されます。そのため、出力HTMLが html ディレクトリ内にある場合、..\theme\css\base.css のように1階層上に移動してから目的のCSSファイルを参照するように指定する必要があります。

コメント

タイトルとURLをコピーしました