ついに夏本番!さぁ、家族でキャンプに行くぞ! >>

教えていただきたいことは、ドットを2個含むファイル名の拡張子をサブフォルダ内も含めてドット1個だけの拡張子に変更するDOSコマンドのことです。
例えば、「*.c.j」のファイル名を「*.java」のように、あるフォルダ以下のファイルの拡張子をすべて変えたいのです。
FORコマンドをヘルプで調べたのですが、良く判りませんでした。
OSはXPで動作すれば十分なのですが、こんな機能のコマンドはあるのでしょうか?

このQ&Aに関連する最新のQ&A

A 回答 (4件)

No.1です。

遅延環境変数の所までは一緒でforコマンドの部分を以下のように変えてはどうでしょう?
for /F %F in ('dir /s /b *.c.j') do set test=%F & copy %F !test:.c.j=.java! & del %F
    • good
    • 0
この回答へのお礼

できました。
ありがとうございます。
私が判らなかったのは、リネームにこだわったのと、&で複数のコマンドを繋げるのを知らなかったためのようです。

お礼日時:2011/04/13 20:13

No.2の補足です。


scriptは一例と考えて自分で適当に編集してください。
その程度は自分で行なってください。
    • good
    • 0

下記のscriptを.bat(または.cmd)として実行してみてください。


内容を見れば解るように、オーソドックスな方法で作成しました。
今回のケースでは
「変更前の拡張子:」という質問には c.j と入力します。( .c.j ではない)
「変更後の拡張子:」という質問には java と入力します。( .java ではない)
rem-----ここからscript
@echo off
echo フォルダ内のファイルの拡張子の変更を行ないます
echo 必要事項を入力してください
echo 何も入力がない場合は終了します
set /p ext1="変更前の拡張子:"
if "%ext1%"=="" goto quit
echo ------------------------------
dir *.%ext1%
echo ------------------------------
echo 以上のファイルが該当しました
echo 変更後の拡張子を入力すると、変更を行います
echo 何も入力がない場合は終了します
set /p ext2="変更後の拡張子:"
if "%ext2%"=="" goto quit
for /R %%i in ( *.c.j ) do echo %%~ni > tmp.txt
for %%j in (tmp.txt) do copy *.%ext1% *.%j%
ren *.c *.%ext2%
echo.
echo 変更完了しました。
:quit
echo.
echo 終了します。(Enterキーを押す)
:end
del tmp.txt *.%ext1% *.c
set /p ext1=""
set /p ext2=""
rem-----script終了
    • good
    • 0
この回答へのお礼

早速の回答をありがとうございます。
コピペして試してみたのですが、カレントディレクトリについては希望どおりになるのですが、サブディレクトリのファイルは変更されません。
また、拡張子は任意のものに変更できそうと思ったのですが、.c.jを.jに変更するのはOKなのですが、.cに変更しようとすると、カレントディレクトリの該当ファイルが削除されてしまいます。

お礼日時:2011/04/11 20:08

コマンドプロンプトで、



cmd /v:on
とし、遅延環境変数を有効にした上で
for /F "tokens=1" %F in ('dir /B') do @set test=%F & ren %F !test:.c.j=.java!

とすると、.c.jを.javaに変更できると思います。
    • good
    • 0
この回答へのお礼

早速の回答をありがとうございます。
試してみたのですが、カレントディレクトリについては希望どおりになるのですが、サブディレクトリは変更されません。
サブディレクトリの数が多いため、ディレクトリを移動しながらのコマンド入力はつらいものがあります。

お礼日時:2011/04/11 20:00

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qbatである文字列内に特定の文字列が含まれているか確認したい

batファイルの中である変数「abc」の中に「test」という文字が含まれていたら○○を行なうという分岐を作成したいのですが、どのように行なえばよいのでしょうか?

そのまま、ずばりのお答えお待ちしております。

よろしくお願い致します。

Aベストアンサー

大文字小文字を区別しなくていいなら、

if not "%abc:test=%" == "%abc%" echo 含まれていた

区別するなら、

echo %abc% | find "test" >NUL
if not ERRORLEVEL 1 echo 含まれていた

QMSDOSからワイルドカード指定で複数ファイル名の一部を一括変更

MSDOSからワイルドカード指定で複数ファイル名の一部を一括変更する方法はありますでしょうか?
例えば、
「a.dat.gz」「b.dat.gz」「c.dat.gz」
上記のような複数ファイルを以下のように変更したいと思っています。
「a.gz」「b.gz」「c.gz」

ちなみに次のコマンドを試してみたのですがダメでした。
ren *.dat.gz *.gz

実際はバッチファイルから処理をさせたいと思っています。
よろしくお願いいたします。

Aベストアンサー

★本当に『a.dat.gz』、『b.dat.gz』、『c.dat.gz』の形式の名前だけですか。
・上記の場合ならば、
 『for %%i in ( a b c ) do ren %%i.dat.gz %%i.gz』で出来ますけど。
 ※a、b、c 以外にあればカッコ内に増やして下さい。
 ※また、バッチファイル内ですので %% と2つにしています。コマンドラインでは % ですよ。
・他にもいろいろな方法はありますけど一例だけ紹介しました。
 ちなみに試していませんが、for 文を使えば ren も上手く利用できます。

その他:
・ワイルドカードの指定で拡張子は、最後のピリオドのフィールドを指します。
 よって、『ren *.dat.gz *.gz』という指定ではすでに拡張子が『.gz』なので上手く出来なかったのです。
・以上。参考に。

Qバッチ処理でファイルの中身を変数に入れるやり方

あるファイルの中には1行の文字列があります。
このファイルをバッチで読み取り、変数に設定したいです。

例:
test.txt
abcacbacbacbacbacbacbacbacb

test,bat
set DATA=[test.txtを読み込んだ値]

よろしくお願い致します。

Aベストアンサー

これですね。

参考URL:http://www.upken.jp/kb/dqvgHNRUxwFDkmtoqEwfXHUjDrevNv.html

Q特定のフォルダ内のある種類のファイルをすべてコピーし格納する方法

WINDOWSマシン使用。
あるフォルダ(AAA)の中に、複数のフォルダやファイルを含み、またそのフォルダは、
は、下位のフォルダやファイルを含むという関係が続きます。階層は4くらい。
この中の各所にあるフォルダにはwordのファイルやその他のファイルを含んで
います。
このwordのファイルだけをすべて選択しコピーして、別のフォルダ(BETU)へ
入れたい。
簡単に行なう方法、あるいはツールなどあれば紹介をお願いします。

Aベストアンサー

はじめまして。

コマンドプロンプトで
for /f "tokens=*" %i in ('dir /b /s AAA\*.doc') do copy "%i" "BETU"
を実行すれば4階層以上深くても可能です。

※"%i" "BETU"と"でくくるのは、ディレクトリ名に空白がある場合エラーとなるのを防ぐためです。

AAAもBETUもフルパスで記述すればコマンド実行ディレクトリは何処でも構いません。

Qバッチファイルで2つ以上の変数を連結し、1つの変数にしたい。

Windows2000でバッチファイルを作っています。
バッチファイルが受け取る2つのパラメータを %1 %2とすると、
それを連結して、新たな変数 A を作りたいのですが、どのようにすれば良いのでしょうか。

Aベストアンサー

SETで変数にパラメータをセットすればOKだと思います。

例)
SET A=%1%2
echo %A%

Qディスク上のサイズとサイズはどうして違うんですか?

ファイルのプロパティ「全般」タブに表示されている「サイズ」と「ディスク上のサイズ」は、どっちが本当のサイズなのでしょうか?
どうしてサイズが違うのですか?
メールでファイルを送るときは、どっちのサイズを見ればいいのでしょうか?
これについて詳しく解説しているページがあったら、それもぜひ教えて下さい。
よろしくお願いします。

Aベストアンサー

「サイズ」はファイルの本当の大きさ、
「ディスク上のサイズ」はファイルが記録されているクラスタを合計した大きさです、
OSはファイルを幾つかのクラスタ(OSが管理するハードディスク上のブロック
の最小単位)を使ってHDDなどのメディアに保存します、

基本的に今のWindowsでは4KBのクラスタサイズで管理しているので例え1バイトのファイルでも「ディスク上のサイズ」4KBのサイズになってしまいます、
つまり常に「ディスク上のサイズ」の方が大きくなっているはずです、

メールに添付する場合は「サイズ」を確認するだけでOKです。

Qコマンドプロンプトによるフォルダ内のファイル存在有無

バッチ処理で、特定のフォルダ内(配下にフォルダとファイルが混在している)でファイルだけの存在有無を調べて、ファイルが存在している場合とファイルが存在していない場合で処理を別々に行わせようとしたいのですが、ファイルの存在有無はどのようにコマンドで調べれば良いでしょうか?

DIR C:\test\*.* でファイルを調べて、ERRORLEVELでif判定させようと思っているのですが、 DIRコマンドでこれを行うと、フォルダまで表示されます。

どのようにしたら良いのでしょうか?教えてください。

Aベストアンサー

コマンドプロンプトで、「DIR /?」と入力すれば、DIRコマンドのヘルプが表示されます。

その記述によれば
「/A」属性スイッチで、必要な属性を持つファイルを指定できます。

Qバッチファイルで昨日の日付を取得

すみません、どなたか教えて下さい。

バッチファイルの記述で、昨日の日付を取得する方法を教えて下さい。
今日の日付は下記のように取得しています。

rem 日時変数の取得
for /f "tokens=1-3 delims=/" %%a in ('echo %date:~-10%') do (set YYYYMMDD=%%a%%b%%c
)

Aベストアンサー

:: ----- prevdate.bat はじめ -----
@echo off
::今日の日付を取得
set yy=%date:~0,4%
set mm=%date:~5,2%
set dd=%date:~8,2%
echo 今日は、%yy%年%mm%月%dd%日です。

::1日前の日付を計算する
set /a dd=%dd%-1
set dd=00%dd%
set dd=%dd:~-2%
set /a ymod=%yy% %% 4
if %dd%==00 (
if %mm%==01 (set mm=12&& set dd=31&& set /a yy=%yy%-1)
if %mm%==02 (set mm=01&& set dd=31)
if %mm%==03 (set mm=02&& set dd=28&& if %ymod%==0 (set dd=29))
if %mm%==04 (set mm=03&& set dd=31)
if %mm%==05 (set mm=04&& set dd=30)
if %mm%==06 (set mm=05&& set dd=31)
if %mm%==07 (set mm=06&& set dd=30)
if %mm%==08 (set mm=07&& set dd=31)
if %mm%==09 (set mm=08&& set dd=31)
if %mm%==10 (set mm=09&& set dd=30)
if %mm%==11 (set mm=10&& set dd=31)
if %mm%==12 (set mm=11&& set dd=30)
)
echo 昨日は、%yy%年%mm%月%dd%日です。

echo.
pause
:: ----- prevdate.bat おわり -----

参考URL:http://www.atmarkit.co.jp/fwin2k/win2ktips/419batchdate/batchdate.html

:: ----- prevdate.bat はじめ -----
@echo off
::今日の日付を取得
set yy=%date:~0,4%
set mm=%date:~5,2%
set dd=%date:~8,2%
echo 今日は、%yy%年%mm%月%dd%日です。

::1日前の日付を計算する
set /a dd=%dd%-1
set dd=00%dd%
set dd=%dd:~-2%
set /a ymod=%yy% %% 4
if %dd%==00 (
if %mm%==01 (set mm=12&& set dd=31&& set /a yy=%yy%-1)
if %mm%==02 (set mm=01&& set dd=31)
if %mm%==03 (set mm=02&& set dd=28&& if %ymod%==0 (set dd=29))
if %mm%==04 (set mm=03&& set dd=31)
if...続きを読む

Qバッチファイルで自身の名前を取得する方法

%date% で「現在時刻」を取得できるように、現在実行中のバッチファイル名を取得できる方法はありませんか?

OS : Windows XP SP 2

Aベストアンサー

バッチファイル自身のファイル名は %0 で取得できます。

『コマンドプロンプトを使ってみよう:バッチパラメータ・修飾子』
http://ykr414.com/dos/bat.html#05

パラメータ「%1」はバッチファイル実行時に付加された最初のパラメータを表す。
2番目は「%2」、3番目は「%3」で全部で9個のパラメータを渡す事ができる。
特別なものに「%0」があり、これは実行されたバッチファイル名を表す。

参考URL:http://ykr414.com/dos/bat.html#05

QDOSのバッチで、テキストファイル中の文字を置換したい

いつもお世話になっております。

WindwsXPでDOSバッチを使ってテキストファイル中にある文字列1を文字列2に置換したいのです。
ネットをさまよっていて、こんな例を見つけました。
(参考にしたのはここです。http://www.fpcu.jp/dosvcmd/bbs/log/cat3/cat54/2-0391.html)

======================
@echo off
if "%1"=="" goto end
set fname=%1
copy %fname% org >nul
type nul >%fname%
for /f "tokens=1* delims=" %%a in ( org ) do (set line=%%a&& call :sub)

del org
goto end

:sub
:この1行下の acb=xyz に置換前と置換後の文字列を指定する。
set l=%line:abc=xyz%
echo %l%>>%fname%
goto :EOF

:end
======================

これをsample.batという名前で保存し、DOSのウィンドウでsample < a.txt と打つと、a.txtファイル中の"abc"が"xyz"に置き換わります。

これに手を入れて置換前と置換後の文字列を可変にしたく思い、sub中に

set mae=abc
set ato=xyz

の2行を加え、変数に値を設定するようにしました。

ところが、次の1行の書き変え方がわかりません。

set l=%line:abc=xyz%



set l=%line:%abc%=%xyz%%

のように変えてみましたが、うまく動きません。

どなたかご教授いただけませんか。DOSだけでファイル中の文字列の置換ができればset文を使う使わないにはこだわりません。

いつもお世話になっております。

WindwsXPでDOSバッチを使ってテキストファイル中にある文字列1を文字列2に置換したいのです。
ネットをさまよっていて、こんな例を見つけました。
(参考にしたのはここです。http://www.fpcu.jp/dosvcmd/bbs/log/cat3/cat54/2-0391.html)

======================
@echo off
if "%1"=="" goto end
set fname=%1
copy %fname% org >nul
type nul >%fname%
for /f "tokens=1* delims=" %%a in ( org ) do (set line=%%a&& call :sub)

del org
goto end

:sub
...続きを読む

Aベストアンサー

No.5 です。

>勝手に引用してしまってすみません。
皆さんに参考にしてもらうために回答しているので気になさらずに引用してください。

さてご質問の件ですが、

◆予備知識
まず、環境変数を%で囲むと、バッチがその行を実行するときに環境変数の中身に置き換えられることを理解してください。
例)
set mae=abc
set ato=xyz

echo %mae% %ato% ←※

※の行が実行されるとき、実際は
echo abc xyz
と置き換えられてecho文が実行されます。

また、バッチ内では %% と%が2つ並んだ記述は1つの%に置き換えられます。

例)echo 10割は100%%
10割は100%


◆今回の場合

call set l=%%line:%mae%=%ato%%%
↓実行されるときに以下のように置き換えられます。
call set l=%line:abc=xyz%

置き換え後に call 文が実行されます。このcall文の記述だと set l=%line:abc=xyz% という1行のバッチを呼び出しているのと同等の動作になります。従って環境変数lineに入っている文字列のabcがxyzに置き換えられた結果が環境変数lに代入されます。
call文でワンクッション置いて、先に環境変数の mae と ato (と%%)だけ評価(環境変数の中身に置き換え)するようにしています。

◆単純に set l=%line:%mae%=%ato%% とした場合なぜうまくいかないか

set文の右辺の各要素を分けて書くと

%line:%(line: という環境変数の中身)→そんな変数は定義していないので空に置き換え

mae

%=%(= という環境変数の中身)→そんな変数は定義できないので空に置き換え

ato

%% → % に置き換え

と解釈されて
環境変数lには maeato% という文字列が代入されてしまいます。


余談ですがバッチ実行時にどのように置き換えられるか見たい場合は、
バッチ先頭のecho offの行を取って実行するとよく分かります。

No.5 です。

>勝手に引用してしまってすみません。
皆さんに参考にしてもらうために回答しているので気になさらずに引用してください。

さてご質問の件ですが、

◆予備知識
まず、環境変数を%で囲むと、バッチがその行を実行するときに環境変数の中身に置き換えられることを理解してください。
例)
set mae=abc
set ato=xyz

echo %mae% %ato% ←※

※の行が実行されるとき、実際は
echo abc xyz
と置き換えられてecho文が実行されます。

また、バッチ内では %% と%が2つ並んだ記述は1つ...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング