質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

Q&A

解決済

2回答

880閲覧

バッチファイルでバイナリn文字目までを読み取りファイル形式を判別したい

Seirious

総合スコア3

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

0グッド

1クリップ

投稿2022/07/18 08:43

編集2022/07/18 13:18

前提

取引先の方が拡張子無しのzipやrarを区別なく送ってきていて毎回判別するのにバイナリで開いてヘッダーを見て判別しています。
その作業が非常に時間的に勿体ないのでコマンドプロンプト・PowerShell・バッチファイル等で自動化できないか考えています。

環境

Windows 10標準搭載のみ

実現したいこと

  • Windows10標準機能のみを使用しバッチファイルでファイルの4byte程度をバイナリで見て拡張子を判別させファイル名.○○(zip/rar/pdf...etc)のようにリネームをさせたい。

(4byte程度じゃなくてもファイルの拡張子の判別ができれば良いです。)

試したこと

rar.bat

1 2find "Rar!" * 3

これだけならばrarファイルとして判別はできるがこれを応用してのリネームができない。(どうやってifに応用すればいいのかわからない。)
当方バッチはあまり触れてこなかった為つらい状況です。

補足情報

Windows 10標準のみです。VSCode等は社内規則で入れることができません。またUSB等の持ち込みも不可なので家でツールを作成する等もできないです。
相手方に何度も言っても治る気配がない状態です。

どなたかヒントだけでもご教授頂けると幸いです。
宜しくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2022/07/18 09:35

リネームができないとはどうなるんでしょうか そこらへんの説明を質問文に追記しよう
guest

回答2

0

自動化サンプル

PowerShell

1$Folder = "C:\新しいフォルダー" 2if ( (Test-Path -LiteralPath $Folder) -eq $True ){ 3 $Files = @(Get-ChildItem -LiteralPath $Folder -Recurse -Force | Where-Object {-not $_.PSIsContainer} | ForEach-Object {$_.FullName}) 4 foreach ($File in $Files){ 5 $Header = @(Get-Content -LiteralPath $File -First 10 -Encoding Byte | ForEach-Object { [char]$_ }) 6 $Header = $Header -join '' 7 if ( $Header -match '^PK' ){ Rename-Item -LiteralPath $File -newName $($File+".zip") } 8 if ( $Header -match '^%PDF-' ){ Rename-Item -LiteralPath $File -newName $($File+".pdf") } 9 } 10 }else{ Write-host '新しいフォルダーがありません' } 11exit 12 13# ■手順■ 14# ①Cドライブに新しいフォルダーを作成して、ファイル(拡張子なし)を入れてください。 15# ②拡張子ps1ファイルを作成して、このプログラムを貼り付けて保存します。 16# ③ps1ファイルをコンテキストメニューから「PowerShell で実行」を選択します。 17 18# ■注意事項■ 19# ※このプログラムは1回限り実行してください。複数回実行するとファイル名が長くなります。 20# ※このプログラムは、拡張子を正確に判定する事はできません。

別の方法で恐縮ですが参考にしてください。
宜しくお願いします。

投稿2022/07/18 13:43

ccc-

総合スコア342

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Seirious

2022/07/18 14:34

PowerShellでの回答有り難う御座います。 PowerShellに関しては一切触れてこなかった為不明なのですがこれを”新しいフォルダー”ではなくps1のカレントディレクトリに対応させるにはどうすればよいのでしょうか。 またお手数ですが今後の参考の為にもどこが何をしているのかを詳しくお教え頂けると幸いです。(参考サイトでも構いません。) 宜しくお願い致します。
ccc-

2022/07/18 16:07

# 解説 $Folder = (Convert-Path .) + "\" + "新しいフォルダー" # ←←←←←←←←←← カレントに変更しました if ( (Test-Path -LiteralPath $Folder) -eq $True ){ # フォルダがあるか調べる $Files = @(Get-ChildItem -LiteralPath $Folder -Recurse -Force | Where-Object {-not $_.PSIsContainer} | ForEach-Object {$_.FullName}) # フォルダ内のファイル名を取得(複数可) foreach ($File in $Files){ # ループ $Header = @(Get-Content -LiteralPath $File -First 10 -Encoding Byte | ForEach-Object { [char]$_ }) # ファイルの先頭10バイトを取得後、アスキーコードから文字を作成 $Header = $Header -join '' # 文字を繋げて文字列にする if ( $Header -match '^PK' ){ Rename-Item -LiteralPath $File -newName $($File+".zip") } # 正規表現を使用して 文字列の^先頭にPK があれば、拡張子zipとしてリネームする if ( $Header -match '^%PDF-' ){ Rename-Item -LiteralPath $File -newName $($File+".pdf") } # 正規表現を使用して 文字列の^先頭に%PDF-があれば、拡張子pdfとしてリネームする } }else{ Write-host '新しいフォルダーがありません' } exit # カレントに変更しました。 # 本プログラムは、フォルダーにファイル(拡張子なし)が存在する事を前提に作成しております。 # 指定したフォルダ以外の場所を、変更しないように制限をかけています。ご了承ください。 # 変更は自由にできます。 # 解説を書いております。お手数ですが分からない命令文はWeb検索をご利用ください。 # お返事ありがとうございました。
Seirious

2022/07/18 17:56

解説を書いて頂き有り難う御座います。 今後のWindowsのことを考えたらPowerShellで書いたほうが良さそうな気がしてきました。 分からない命令文、単語は調べて理解していきたいと思います。 改めて有り難う御座いました。
guest

0

ベストアンサー

バッチファイルでやるとすると、

CMD

1setlocal 2set "FILE=%~1" 3set /p FIRSTLINE=<"%FILE%" 4if "%FIRSTLINE:~0,2%" == "PK" ( 5 move "%FILE%" "%FILE%.zip" 6) else if "%FIRSTLINE:~0,3%" == "Rar" ( 7 move "%FILE%" "%FILE%.rar" 8) else if ~~~ ( 9~~~~ 10) else echo 不明なファイルです

正しく判断するために何文字必要とかは調べてないので、上記はあくまでサンプルです。

注:バイナリーファイルの読み込みは出来ないので、FIRSTLINE には最初の CRLF までの文字が入ります。
また、比較時には制御文字とかはたぶん使えない。

投稿2022/07/18 11:29

編集2022/07/18 15:13
otn

総合スコア84559

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Seirious

2022/07/18 13:16

ご教授頂き誠にありがとうございます。サンプルを動作させてみたのですが拡張子は表示されたのですが肝心のファイル名が消えて".zip"等になるようになってしまいました。 batの解説的には 1行目のsetlocalでローカル変数と定義 2行目のset "FILE=%~1"でドラッグアンドドロップされたファイル名をFILEに代入?(格納?) 3行目でお教え頂いたFIRSTLINEでファイルの最初のCRLFまでを入れる 4行目のif "%FIRSTLINE:~0,2%" == "PK"でファイルの判別化 5行目のif()内にてifに該当した場合のファイルのリネーム 6行目以降は4行目,5行目の繰り返し 上記の認識で合ってますでしょうか。 またFIRSTLINE:~0,2はファイルの0番目から2番目の文字列、を表すもので合ってますでしょうか。 そして5行目のren "%FILE%" "%FILEL%.zip"の部分ですが、"%FILE%"の部分はファイル名が入るのは分かるのですが2つ目はなぜ%FILE"L"%になるのでしょうか。 質問に質問を重ねて誠に申し訳御座いませんがお教え頂けると幸いです。 宜しくお願い致します。
otn

2022/07/18 13:29

すいません。変数名のタイプミスですね。直しておきます。
otn

2022/07/18 13:31

ご認識は合ってます。
Seirious

2022/07/18 14:22

修正後のbatを試して見ましたが コマンドの構文が誤っています。 と出てきてしまいます。 ren "%FILE%" "%FILEL%.zip"の時はエラーは出ないで".zip"になるだけでした。
otn

2022/07/18 15:13 編集

あー、FILEにディレクトリがあると、ren じゃなくて move でないと駄目でした。 失礼しました。
Seirious

2022/07/18 17:54

詳しく書いて頂き有り難う御座いました。 ベストアンサーにさせて頂きました。 改めて有り難う御座いました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問