このブログは、旧・はてなダイアリー「檜山正幸のキマイラ飼育記 メモ編」(http://d.hatena.ne.jp/m-hiyama-memo/)のデータを移行・保存したものであり、今後(2019年1月以降)更新の予定はありません。

今後の更新は、新しいブログ http://m-hiyama-memo.hatenablog.com/ で行います。

diredからPDF表示

! s [RET] の3キーだから、まあいいとしよう。空白を含むファイルはダメ。

次のバッチファイルを ~/bin/s.bat とかにする。

@echo off
echo This is %0
echo Received %1
set arg1=%1
set arg=%arg1:"=%

echo !! Starting %arg% !!
start %arg%

要点は:

  1. Windowsのstartは引用符を解釈できない。
  2. したがって、空白入りファイルはダメ。
  3. 引用符の削除は文字列置換機能を使う。(そんなんがあったのだ。)
  4. 置換機能は %1 など引数参照には使えない。

[追記]クォートと空白の問題は回避できる。

@echo off
echo This is %0
echo Received %1
set arg1=%1
rem set arg=%arg1:"=%
set arg=%arg1%
echo !! Starting %arg% !!
start "" %arg%

だが、日本語のファイル名はダメ。EmacsとOSでエンコーディングが違うようだ。文字列のコード変換を噛ませばいいが、バッチファイルで $(...) ってどうやる?[/追記]

[さらに追記]日本語ファイル名もなんとかなった。

@echo off
setlocal
rem echo This is %0
rem echo Received %1
set arg=%1
echo %arg% > %TEMP%\%USERNAME%_s_bat.tmp
for /F %%x in ('iconv -f utf-8 -t sjis %TEMP%\%USERNAME%_s_bat.tmp') do (
    echo Starting %%x
    start "" %%x
)
endlocal

iconvを使って変換。中間ファイルを使わずに、'echo %arg% | iconv -f utf-8 -t sjis' とは出来ない。パイプ記号が構文エラーとなる。[/さらに追記]

[さらにさらに追記]日本語ファイル名もなんとかなった。

少し短く。

@echo off
rem echo This is %0
rem echo Received %1
echo %1> %TEMP%\%USERNAME%_s_bat.tmp
for /F %%x in ('iconv -f utf-8 -t sjis %TEMP%\%USERNAME%_s_bat.tmp') do (
    echo Starting %%x
    start "" %%x
)

ほとんどうまくいくが、echo %1 の段階で、文字列が壊れることがある。そうすると全体も失敗。理由は不明。

[/さらにさらに追記]

[続続続 追記]2016-02 どうもうまくない。漢字ファイル名はダメだし、空白もダメで、根本的に考え直す必要がある。が、やってない。[/続続続 追記]