匿名質問者

フォルダ内のバイナリファイルの先頭に格納されているASCII文字列を任意バイト分抽出し、そのファイルの後ろにくっつける形でリネーム、という処理を連続でしたいのですが、良い方法はないでしょうか?

例: A.dat の先頭バイナリデータが「1a2b3c4d5e6f」となっていて、1a2b3c4dまでを抽出し A[1a2b3c4d].datにリネーム、B.dat以下も同様に…という感じです。

一般的なリネームソフトではこの処理のできるものが見当たらず、CUIツールはいくつか当たりましたが出力フォーマットに余計なものが付いたりバッチ処理させようとするとエラーになったりで途方に暮れています。

そもそもbatファイルのFor文で頭から煙が出るレベルのPCスキルなので、バッチ処理になるならどう書けばいいかもご教授願いたいです。

環境はWindows7 x64です。よろしくお願いいたします。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2015/09/17 12:51:33

ベストアンサー

匿名回答2号 No.2

ただ、このバッチだとファイル単体なら正常に処理してくれるんですが引数にワイルドカードの入ったものを指定すると構文エラーになってしまいます。

先にバッチファイル側でワイルドカードを展開してやれば良いかと。

@echo off
setlocal ENABLEDELAYEDEXPANSION
for %%f in (%1) do (
    for /f "usebackq tokens=*" %%i in (`strings.exe -q -a -b 10 %%f`) do set RESULT=%%i
    ren "%%f" "!RESULT!+%%f"
)
endlocal
他4件のコメントを見る
匿名質問者

おお、本来の(当初の質問の)ファイル群でも問題なくリネームされました。素晴らしいです。アドバイスも参考にさせていただきます。

> バッチは制限が多くてレアケースとか異常ケースに対応するのは難しいです…。
上の回答者様も仰ってますが、やはり素のWindowsでこういうバッチ処理を行うのはやりにくいんですかね。私自身も調べているとLinuxならもっと簡単だの融通がきくだの書いてるページが多かったですし。

何はともあれ、お付き合いいただきありがとうございました。大変勉強になりました。

2015/09/16 13:31:55
匿名回答2号

XP世代のサポートが終了したことだし、もう(環境も人も)PowerShellが使えることを前提にしても良いのではないですかね。

2015/09/16 15:20:45

その他の回答1件)

匿名回答1号 No.1

Windows環境だとどうやっても何か言語処理系をインストールしてプログラムかスクリプトを書く必要があります。

この作業をする目的によっては直接解決できなくても別のアプローチがありそうな気がしますが。

匿名質問者

質問者から

匿名質問者2015/09/16 04:01:33

結論から言うと解決しました…がまだ疑問が。

Stringsという実行結果として文字列だけを返してくれる良いプログラムを見つけ、グーグル先生に頼りつつ見よう見まねで書いたバッチファイルが以下です。

------------------------------------------------------------

for /f "usebackq tokens=*" %%i in (`strings.exe -a -b 10 %1`) do @set RESULT=%%i

REN %1 %RESULT%+%1

------------------------------------------------------------

  • a: ascii文字列のみ抽出
  • b: 抽出バイト数指定(今回は10バイト)

ただ、このバッチだとファイル単体なら正常に処理してくれるんですが引数にワイルドカードの入ったものを指定すると構文エラーになってしまいます。

当初の目的は該当バイナリファイルのリストを作り、別のバッチからCallで1ファイルずつこのバッチに投げて処理させることで果たせましたが、モヤモヤが残ります。

後学のために正しい書き方を知りたいのでお暇な方いらっしゃいましたらご回答お願いします。

匿名回答2号 No.2

ここでベストアンサー

ただ、このバッチだとファイル単体なら正常に処理してくれるんですが引数にワイルドカードの入ったものを指定すると構文エラーになってしまいます。

先にバッチファイル側でワイルドカードを展開してやれば良いかと。

@echo off
setlocal ENABLEDELAYEDEXPANSION
for %%f in (%1) do (
    for /f "usebackq tokens=*" %%i in (`strings.exe -q -a -b 10 %%f`) do set RESULT=%%i
    ren "%%f" "!RESULT!+%%f"
)
endlocal
他4件のコメントを見る
匿名質問者

おお、本来の(当初の質問の)ファイル群でも問題なくリネームされました。素晴らしいです。アドバイスも参考にさせていただきます。

> バッチは制限が多くてレアケースとか異常ケースに対応するのは難しいです…。
上の回答者様も仰ってますが、やはり素のWindowsでこういうバッチ処理を行うのはやりにくいんですかね。私自身も調べているとLinuxならもっと簡単だの融通がきくだの書いてるページが多かったですし。

何はともあれ、お付き合いいただきありがとうございました。大変勉強になりました。

2015/09/16 13:31:55
匿名回答2号

XP世代のサポートが終了したことだし、もう(環境も人も)PowerShellが使えることを前提にしても良いのではないですかね。

2015/09/16 15:20:45

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません