![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?8acaa2e)
複数のフォルダ内に、下記のようなファイルがあります。
ABCD_aaaa_20091234567899_1_of_3.csv
ABC_DDD_bbbb_20091234567899_2_of_3.csv
AAA_ccccd_20091234567899_3_of_3.csv
作業内容:ファイル名の「2009xxxxxxxxxx」を「FY08_01」
に変更します。
現在のファイルの状態:
・「2009」の後の数字「xxxxxxxxxx」は共通で、10桁あります。
・「2009xxxxxxxxxx」の前のテキストの文字数や内容は一致
していません。
・「2009xxxxxxxxxx」の前後には必ず「_」(アンダースコア)があります。
・「2009xxxxxxxxxx」の後は必ず「x_of_x」となっています。
そこでDOSコマンドこんな風に書いてみたのですが、構文エラーとなってしまいました。
*********
echo off
for %%a in (*_*.csv) do (
set fname=%%a
set fname=%fname:~-25,14="FY09_01"%
ren %%a %fname%
)
*********
Webで検索して他の方法もいろいろと試したのですが、余計にわからなくなってきてしまいました。setコマンドはワイルドカードが使えないので頭をかかえています。
どなたかご教示いただければ幸いです。
よろしくお願いします。
No.3ベストアンサー
- 回答日時:
#2です。
考えすぎたようです orz.....#1の方の回答のままでは駄目ですが、
@echo off
for %%a in (*_*.csv) do call :sub %%a
goto :EOF
:sub
set A=%1
ren %A% %A:~0,-25%FY08_1%A:~-10%
goto :EOF
早速の回答、有難うございます!(初めての投稿で、こんなに早くお返事をいただけると思っていませんでした)
いただいた.bat を試した結果、
(前)AAA_ccccd_20091234567899_3_of_3.csv
↓
(後)AAA_ccccd_FY08_13_of_3.csv
となって"FY_1"と"3"がくっついてしまったのですが、
ren %A% %A:~0,-25%FY08_1%A:~-10% にアンダースコア(_)を
↓
ren %A% %A:~0,-25%FY08_1_%A:~-10%
のように追加したところ、完璧にできました!
助かりました。
前のコメントでご指摘のように、まだ駆け出しなので「()」は使わないようにしたいと思います。
No.6
- 回答日時:
他人の回答に勝手に解説を入れる試み:
#5 の「call」は UNIX のシェルにおける eval のようなもので, 「変数を展開してから再度実行する」という意味になります. だから
call set new=%%old:!dt!=FY09_01%%
は実質的に現在のシェルで
set new=%old:何とか=FY09_01%
(「何とか」は環境変数 dt を展開した結果: !dt! なので, 「実行時の値」を使う. あと, %% を展開すると % になることに注意) と入力したのと同じことになり, これを実行するので目的を達成できる, と.
こちらもフォローアップ有難うございました。
UNIXですか。。こちらもまた不案内ですが、考え方はわかりました。
皆様のご協力、感謝します!仕事に役立てます。
No.5
- 回答日時:
#4です。
すいません。適当なこと書いて。
こんなんでどうですかね。
--------------------------------
echo off
setlocal enabledelayedexpansion
for %%a in (*_*.csv) do (
set old=%%a
set dt=!old:~-25,14!
call set new=%%old:!dt!=FY09_01%%
ren !old! !new!
)
endlocal
--------------------------------
サブルーチン化があまり好きでないので遅延展開で。
call set 環境変数=%%・・・・%%
ってのは遅延展開の技?みたいなものらしい・・・。
詳しくなくてすみません。
呼ばれるタイミングを利用してるのではないかな?
No.4
- 回答日時:
面白そうなんでちょっとみてみました。
for文の中が
set fname=%%a
set dt=%fname:~-25,14%
call set new=%fname:%dt%=FY09_01%
ren %%a %new%
ではどうでしょう。
ちゃんと検証はしてないけど。
この回答への補足
早速の回答有難うございます(回答の早さに本当にびっくりしています)。
初心者のため、理解が遅くて申し訳ないのですが、いただいた
回答に基づいた構文は下のようになりますでしょうか?
for %%a in (*_*.csv) do (
set fname=%%a
set dt=%fname:~-25,14%
call set new=%fname:%dt%=FY09_01%
ren %%a %new%
)
多分私が間違っていると思うのですが、特にファイル名に変化はないようです。ちなみに"call" は バッチファイル名を呼び出すコマンドだと
理解しているのですが、上のような使い方もあるのでしょうか?
わからないことばかりで申し訳ありません。よろしくお願いします。
No.2
- 回答日時:
残念ながら「後ろから25文字目から14文字を置換」というのは出来ません。
また、doの後のカッコの中での環境変数の取り扱い方法も間違っています。初心者はカッコを使わない方が良いです。ファイル名の長さごとに場合分けをするのがわかりやすいでしょう。
だらだら並べずにループで処理することも出来ますが、やや高度です。あとでわからなくなるかもしれないので、お勧めしません。
@echo off
for %%a in (*_*.csv) do call :sub %%a
goto :EOF
:sub
set A=%1
set B=
if /i "%A:~30,3%" == "csv" set B=%A:~0,8%FY08_01%A:~22,10%
if /i "%A:~31,3%" == "csv" set B=%A:~0,9%FY08_01%A:~23,10%
if /i "%A:~32,3%" == "csv" set B=%A:~0,10%FY08_01%A:~24,10%
(中略)
if not defined B echo !!!! ERROR FILE="%A%" !!!!&goto :EOF
ren %A% %B%
goto :EOF
ループする場合。
:sub
set A=%1
set N=20
:loop
if %N% gtr 99 echo !!!! ERROR FILE="%A%" !!!!&goto :EOF
set /a N+=1
call set CSV=%%A:~%N%,3%%
if /i not "%CSV%" == "csv" goto loop
set /a I=N-22
set /a J=N-8
call set B=%%A:~0,%I%%%FY08_1%%A:~%J%,10%%
ren %A% %B%
goto :EOF
No.1
- 回答日時:
for %%a in (*_*.csv) do (
set fname=%%a
ren %fname% %fname:~0,-25%FY08_01%fname:~-10%
)
ってできるんだっけ?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/15 15:12
- Visual Basic(VBA) 【VBA】印刷マクロのループ処理が反映されません 3 2022/08/09 02:15
- Access(アクセス) access,vbaでフォルダ内のファイルをテーブルにインポート、ファイル名もフィールドに追加したい 1 2022/08/31 11:11
- Excel(エクセル) 【VBA】複数ブックから特定のシートを抽出して一つのブックに集約するマクロについて 3 2022/09/04 15:05
- その他(プログラミング・Web制作) pythonでクラスで複数のメソッドを利用する方法 2 2022/04/15 04:17
- Windows 10 renameコマンドでファイル名からアンダースコアを消す方法 5 2023/04/24 13:33
- Visual Basic(VBA) エクセルのマクロを使ってメールを送る方法について教えてください 2 2022/03/29 01:36
- Excel(エクセル) エクセルVBA、ファイル名をセルの値で保存の方法を教えてください。 おそれいります。こちらで数々のエ 6 2023/06/30 22:17
- Visual Basic(VBA) Excel VBA でデータ転記について 1 2023/03/07 19:11
- Visual Basic(VBA) 特定の文字を含むシートだけマクロ処理をしたい 1 2023/05/22 01:43
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
子バッチ内のキー入力処理へ自...
-
呼び出し元バッチを知るには?
-
バッチでテキストファイルから...
-
絶対パス名からファイル名を取...
-
バッチファイルに日付(ミリ秒...
-
バッチファイルで昨日の日付を取得
-
コマンドプロンプト(バッチ)...
-
echoとsystem関数について
-
大量のフォルダからひとつのフ...
-
同名のフォルダを検索・削除したい
-
VBAでワークシートを引数として...
-
コマンドプロンプトのエラーに...
-
ファイルのサイズを0にする or ...
-
コマンドプロンプトの「%1」と...
-
Python CSVファイルについて
-
virualboxで仮想マシンフォルダ...
-
PCのアプリケーションを別のPC...
-
binファイルを解凍したいの...
-
PDFファイルを開き、印刷し、閉...
-
Latexで図番号だけを「図1.1」...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バッチでテキストファイルから...
-
コマンドプロンプト標準出力と...
-
バッチファイルで昨日の日付を取得
-
コマンドプロンプト(バッチファ...
-
コマンドプロンプトで2ヶ月前3...
-
コマンドプロンプト画面の閉じ...
-
絶対パス名からファイル名を取...
-
呼び出し元バッチを知るには?
-
VBアプリケーションで終了コー...
-
コマンドプロンプト(バッチ)...
-
バッチファイルでDirで取得した...
-
echoとsystem関数について
-
バッチファイルで常に最新の現...
-
子バッチ内のキー入力処理へ自...
-
IPアドレスの第3オクテットだ...
-
バッチファイル テキストファイ...
-
DOSのバッチで、テキストファイ...
-
DOSのバッチで、変数中のファイ...
-
C#でメジャーなバッチフレーム...
-
batの変数を直接vbsのプログラ...
おすすめ情報