人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

フォルダ内のバイナリファイルの先頭に格納されているASCII文字列を任意バイト分抽出し、そのファイルの後ろにくっつける形でリネーム、という処理を連続でしたいのですが、良い方法はないでしょうか?
例: A.dat の先頭バイナリデータが「1a2b3c4d5e6f」となっていて、1a2b3c4dまでを抽出し A[1a2b3c4d].datにリネーム、B.dat以下も同様に…という感じです。

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

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

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

●質問者: 匿名質問者
●カテゴリ:コンピュータ
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● 匿名回答1号

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

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


質問者から

結論から言うと解決しました…がまだ疑問が。
Stringsという実行結果として文字列だけを返してくれる良いプログラムを見つけ、グーグル先生に頼りつつ見よう見まねで書いたバッチファイルが以下です。
------------------------------------------------------------
for /f "usebackq tokens=*" %%i in (`strings.exe -a -b 10 %1`) do @set RESULT=%%i
REN %1 %RESULT%+%1
------------------------------------------------------------

ただ、このバッチだとファイル単体なら正常に処理してくれるんですが引数にワイルドカードの入ったものを指定すると構文エラーになってしまいます。
当初の目的は該当バイナリファイルのリストを作り、別のバッチからCallで1ファイルずつこのバッチに投げて処理させることで果たせましたが、モヤモヤが残ります。
後学のために正しい書き方を知りたいのでお暇な方いらっしゃいましたらご回答お願いします。


2 ● 匿名回答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

匿名質問者さんのコメント
ご回答ありがとうございます。勉強になります。こういう風に書けば良かったんですね。 ただ、エラーは出なくなりましたが拡張子によって出力がおかしくなる物があるようです。 例えばpngだとこんな感じです。 http://i.imgur.com/hAGOsry.png オプションが悪いのかと思い、-aを-uに変更したり抽出バイト数を変更したりしましたが効果なしです。 一方でtxtやjpgだと問題なくリネームされたので、バイナリヘッダによってこうなる、もしくはStrings側のバグということなんでしょうかね? なにか盛大な勘違いをしていたならごめんなさい。

匿名回答2号さんのコメント
「出力がおかしくなる」というのは、10文字の文字列が付かずに"PNG"という3文字しか付かないということでしょうか?

匿名質問者さんのコメント
いえ、文字数=バイト数でないのは理解しております。そこは大丈夫です。 わかりにくい例だったですね。すみません。 ここでおかしいのは、まずImageAが何故か2回処理対象になっていて、しかも後の方は前のファイルの変数が引数に紛れ込んでおり、結果ファイル名も"PNG+ImageA"になるはずが"PNG+PNG+ImageA"になってしまっていますよね。 これはこのバッチ処理としては正常なんでしょうか? その後検証していると、pngでも問題ないファイル群もあったりで混乱してきました。 とりあえず2chのdatファイルだともっと訳の分からない壊れ方になってます。 http://i.imgur.com/rMRU8F0.png もはや趣旨から外れてしまってますが、ご回答いただければ。

匿名回答2号さんのコメント
1度リネームしたファイルが再度リネームされてしまっていますね。 一旦リストを作る方法しか思い浮かびませんでした。 >|winbatch| @echo off setlocal set temp_list=.temp_list if exist "%temp_list%" del "%temp_list%" for %%f in (%*) do echo>> "%temp_list%" %%f for /f "usebackq delims=" %%f in ("%temp_list%") do ( for /f "usebackq delims=" %%i in (`strings.exe -q -a -b 10 "%%f"`) do ( if ERRORLEVEL 0 ( ren "%%f" "%%i+%%f" ) ) ) endlocal ||< 他にも、リネーム先の名前が既に存在する場合にもうまく動きませんので、リネームではなく空のフォルダに移動させる方が良いと思います。 また、空白文字を含むファイル名にも対応し切れていません。 バッチは制限が多くてレアケースとか異常ケースに対応するのは難しいです…。

匿名質問者さんのコメント
おお、本来の(当初の質問の)ファイル群でも問題なくリネームされました。素晴らしいです。アドバイスも参考にさせていただきます。 > バッチは制限が多くてレアケースとか異常ケースに対応するのは難しいです…。 上の回答者様も仰ってますが、やはり素のWindowsでこういうバッチ処理を行うのはやりにくいんですかね。私自身も調べているとLinuxならもっと簡単だの融通がきくだの書いてるページが多かったですし。 何はともあれ、お付き合いいただきありがとうございました。大変勉強になりました。

匿名回答2号さんのコメント
XP世代のサポートが終了したことだし、もう(環境も人も)[https://ja.wikipedia.org/wiki/Windows_PowerShell:title=PowerShell]が使えることを前提にしても良いのではないですかね。
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ