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

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

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

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

コマンドプロンプト

コマンドプロンプト(cmd.exe)はMicrosoftによって提供されているコマンドラインインタプリタです。OS/2・Windows CE・Windows NTで使用可能です。

バッチファイル

バッチファイル(Batch File)は、Windowsのコマンドラインインタープリターによって複数のコマンドを実行させる事が出来るスクリプトファイルです。

Q&A

1回答

1032閲覧

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

WeilSpinor

総合スコア170

Windows 10

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

コマンドプロンプト

コマンドプロンプト(cmd.exe)はMicrosoftによって提供されているコマンドラインインタプリタです。OS/2・Windows CE・Windows NTで使用可能です。

バッチファイル

バッチファイル(Batch File)は、Windowsのコマンドラインインタープリターによって複数のコマンドを実行させる事が出来るスクリプトファイルです。

0グッド

1クリップ

投稿2019/05/03 16:11

編集2019/05/03 16:22

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

#要件
カレントディレクトリ内の全ての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」に一行ずつ書き込み、
そこから一つずつファイル名を取り出して、リネームしています。

bat

1@echo off 2 3for %%a in (*.php) do ( 4 echo %%a >> filename.txt 5) 6 7setlocal ENABLEDELAYEDEXPANSION 8for /f "tokens=1,2,3 delims=_" %%a in (filename.txt) do ( 9 rename %%a_%%b_%%c %1_%%b_%%c 10) 11end local 12 13setlocal ENABLEDELAYEDEXPANSION 14for /f "tokens=1,2 delims=_" %%a in (filename.txt) do ( 15 rename %%a_%%b %1_%%b 16) 17end local 18 19del filename.txt

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

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

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

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

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

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

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

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

guest

回答1

0

案1:

CMD

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

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

CMD

1for /f %%A in (filename.txt) do call :SUB "%%A" 2exit /b 3 4:SUB 5set A=%~1 6set N=-1 7for %%I in (%A:_= %) do set /a N+=1 8echo アンダーバーの数は%N%個 9exit /b

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

投稿2019/05/03 17:08

編集2019/05/04 17:23
otn

総合スコア84557

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問