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

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

ただいまの
回答率

88.82%

コマンドプロンプトでテキスト中のデリミタの個数を自動認識したい

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 646

WeilSpinor

score -34

ファイル名を変更するコマンドプロンプトのバッチファイルを作ったのですが、改善したい点があります。

要件

カレントディレクトリ内の全てのphpファイルを、デリミタ'_'で区切ったn番目のtokenを、標準入力で入力された文字列で置き換える(renameする):
(例1)
shizuka_minamoto.php -> shizuka_nobi.php
yoshitsune_minamoto.php -> yoshitsune_nobi.php
tarou_minamoto.php -> tarou_nobi.php
2番目のtokenを、入力文字列'nobi'で置き換えた
(例2)
shizuka_minamoto_love.php -> shizuka_minamoto_violin.php
takahiro_karasawa_love.php -> takahiro_karasawa_violin.php
yaju_senpai_love -> yaju_senpai_violin.php
3番目のtokenを、入力文字列'violin'で置き換えた

コード

以下がbatファイルです。
カレントディレクトリ内の全てのphpファイルのファイル名を「filename.txt」に一行ずつ書き込み、
そこから一つずつファイル名を取り出して、リネームしています。

@echo off

for %%a in (*.php) do (
  echo %%a >> filename.txt
)

setlocal ENABLEDELAYEDEXPANSION
for /f "tokens=1,2,3 delims=_" %%a in (filename.txt) do (
  rename %%a_%%b_%%c %1_%%b_%%c
)
end local

setlocal ENABLEDELAYEDEXPANSION
for /f "tokens=1,2 delims=_" %%a in (filename.txt) do (
  rename %%a_%%b %1_%%b
)
end local

del filename.txt

今回のケースでは、操作対象のファイルのファイル名の形式は、デリミタ'_'の数が1個のケースと2個のケースの2種類のみだったので、単純に、処理を1個のケースと2個のケースで分けて並べて書きました。

改善したい点

・cd内のファイルには、ファイル名に含まれるデリミタ'_'の数が1個のものと2個のものが混在しているため、当てはまらないファイルに対して実行された処理については必ずエラーが出る(期待した挙動はしてくれるが、エラーが気持ちわるい)
→ファイル名に含まれるデリミタ'_'の数を自動的に認識して条件分岐で処理したい

コマンドプロンプトという原始的なプログラム言語には、そこまで便利な関数が存在するのでしょうか?それとも色々工夫してやるしかないのでしょうか?
ご回答宜しくお願いしいます。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

案1:

for /f "tokens=1-5 delims=_" %%A in (filename.txt) do (
  if not "%%E" == "" (
    echo アンダーバーは4つ以上
  ) else if not "%%D" == "" (
    echo アンダーバーは3つ
  ) else if not "%%C" == "" (
    echo アンダーバーは2つ
  ) else if not "%%B" == "" (
    echo アンダーバーは1つ
  ) else (
    echo アンダーバーは無し
  )
)


案2:(ファイル名に空白、カンマ、セミコロン、イコール等一部の記号が含まれないことが前提)

for /f %%A in (filename.txt) do call :SUB "%%A"
exit /b

:SUB
set A=%~1
set N=-1
for %%I in (%A:_= %) do set /a N+=1
echo アンダーバーの数は%N%exit /b


個数を知りたいだけなら、案2ですが、個数で分岐するなら、案1ですかね。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.82%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る