環境:Windows 2000Pro

現在、拡張子を変換するのに以下のような処理をしています。

1)変換対象ファイルの一覧をバッチ・ファイルとして保存。
  // bak_lst.cmd ----------------------------
   ren E:\Test\Sample.txt Sample.bak
   ren E:\Test\Sample02.txt Sample02.bak
            :
  // bak_lst.cmd -END -----------------------

2)起動用バッチ・ファイル(to_bak.cmd)からCALL文で(1)にて作成したバッチ・ファイルを呼び出す。
  // to_bak.cmd ---------------
   @echo off
   call E:\Test\bak_lst.cmd
  // to_bak.cmd -END ----------

■ これを、

1)変換対象ファイルの一覧は、ファイル名のみの羅列でテキストファイルとして保存。
  // bak_lst.txt ------------
   E:\Test\Sample.txt
   E:\Test\Sample02.txt
        :
  // bak_lst.txt -END -------

2)バッチ・ファイルで(1)にて作成したテキストファイルを読み込んで拡張子の変換を実行。
  //???.cmd: for %%f in (E:\Test\list.txt) do ren ・・・
  // 結果 -------------------
   E:\Test\Sample.bak
   E:\Test\Sample02.bak
        :
  // 結果 -END --------------

と言うように、出来るでしょうか?

厚かましい質問ですが、よろしくお願いいたします。

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

A 回答 (5件)

以下のようにすれば望みのことができます。


#Windows2000 sp2で確認済


/* 1.cmd
for /F %%a in (bak_lst.txt) do call rencmd.cmd %%a

/* rencmd.cmd
for /F "tokens=1,2 delims=." %%b in ("%1") do rename %%b.%%c %%b.bak


#但し上記方法では、対象ファイルが同一フォルダ内かフォルダ名に「.」が
#複数入っていないことが条件です。
    • good
    • 0
この回答へのお礼

出来ました。(うれしい!)
リファレンスの「for文」項目で「tokens, delims」などは認識していたのですが、いまいち私には理解出来ていませんでした。

delims = 引数を指定文字列でスプリット(分割)
tokens = スプリットされた要素の配列インデックス(的?)

と解釈しましたが、間違っていませんか?

お礼日時:2001/07/27 19:46

delims で指定出来るのは文字列では無く単一の文字です。


tokens の解釈はそれであっています。

あとtokens の指定で tokens=1,2* とすると
分割したtokenの2番目以降を2つ目の変数に全部渡すことが出来ます。
(今回だと %Cに)

また以下の方法でファイルリスト使う方法の替わりが出来ます

/+ for /F %%a in (bak_lst.txt) do call rencmd.cmd %%a の替わり
FOR /F "usebackq " %%i IN (`dir /B *.txt`) DO call rencmd.cmd %%i

#上記はCMDバッチと対象のファイルが同一のフォルダにあるものとしています。
    • good
    • 0
この回答へのお礼

複数の質問に回答していだだき、ありがとうございました。
お陰で、for文の理解度がアップしました。

お礼日時:2001/07/28 08:09

「特定の拡張子を持った一覧ファイルに記述されたファイル全てを特定拡張子に変換する」というのでしたら


sedやawkを組み合わせれば可能です。

ファイル一覧として
---- list.txt -----
aaaaa.txt
bbbbb.txt
cccb.txt
---- list.txt -----
と書かれているとします。

バッチとスクリプトとして
---- reext.bat -----
sed -f sp list.txt >tmp
awk -f sp2 tmp >tmp.bat
call tmp.bat
del tmp
del tmp.bat
---- reext.bat -----
---- sp -----
s/.txt//g
---- sp -----
---- sp2 -----
{printf("ren %s.txt %s.bak\n", $0, $0)}
---- sp2 -----
この3つのファイルをつくり、reext.batを実行すると
list.txtの中のファイルが
aaaaa.txt -> aaaaa.bak
bbbbb.txt -> bbbbb.bak
cccb.txt -> cccb.bak
とリネームされるはずです。
    • good
    • 0
この回答へのお礼

実は、この改名処理は某エディタのマクロから呼び出す形で実行しておりまして、そのマクロではバッチコマンドではなくて、Perlスクリプトを呼び出しています。
しかし、出来るならソフト(Perl)に依存することなくOS標準の機能で簡単に、且つ、スマートに出来ないかと思い質問した次第です。お手を煩わしてすみません。

sed, awkのサンプルソースまで用意していただき、ありがとうございました。

お礼日時:2001/07/26 20:02

 BATファイルはそういうことをするものではないので、やりたいのであればWSHを勉強した方が近道です。


 リファレンスでよければマイクロソフトのページに掲載されていますので、そこを見てみてください。
 2000には最初からWSHが入ってるはずです。

--------------------○
TargetFile="bak_lst.txt"
Set fso = CreateObject("Scripting.FileSystemObject")
Set bkl = fso.OpenTextFile(TargetFile,1)

Do While bkl.AtEndOfLine = False
lFile = bkl.ReadLine
If fso.FileExists(lFile) = True Then
nFile = Replace(lFile, ".txt", ".bak")
fso.MoveFile lFile, nFile
End If
Loop
--------------------○

 サンプルってことでこういうの作ってみました。
 「----○」の範囲内を to_bak.vbs というファイル名で保存し、bak_lst.txt をこのファイルと同じフォルダに作って to_bak.vbs をダブルクリックします。するとbak_lst.txt の中に記載されたファイルがすべて、bak に置き換わります。

 ただしこれはあくまでサンプルなので、ファイルは .txt のみ対象です。また、対象ファイルは必ずフルパスで記載されていなければならず、ファイル名のどこかに拡張子以外で「.txt」という文字が含まれていると誤動作します。

参考URL:http://www.microsoft.com/japan/developer/scripti …
    • good
    • 0
この回答へのお礼

> BATファイルはそういうことをするものではないので
はい、バッチ処理の得手、不得手と言うものが全く理解できていません。

WSHは「勉強しよう」と思った事もあるのですが、それより先にPerlに飛びついてしまいました。
「それなら、最初からPerlでやれよ!」というお叱りを受けそうですが、この改名処理は某エディタのマクロから呼び出す形で実行しております。
ですので、出来るならソフト(Perl)に依存することなくOS標準の機能(WSHも標準?)で簡単に、且つ、スマートに出来ないかと思い質問した次第です。お手を煩わしてすみません。

WSHのサンプルソースまで用意していただき、ありがとうございました。
WSHも勉強してみます。

お礼日時:2001/07/26 19:58

たぶんそういうことはできないと思います。



参考URL:http://www1.plala.or.jp/tsune/2msdos.html#c_for
    • good
    • 0
この回答へのお礼

そうですか。
彼是やってもエラーばかりが返ってくるので質問したんですが、残念です。

回答ありがとうございました。

お礼日時:2001/07/26 19:54

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

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

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

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

Qバッチファイルからバッチファイルを呼びだす

例えば「テスト.bat」というバッチファイルを開こうとして、startやcallコマンドを使っても
「'テスト.bat' は、内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチ ファイルとして認識されていません。」
と表示されます・・・
書式はいろいろ試しました。
テスト.bat
call テスト.bat
start テスト.bat
call :テスト.bat
call :テスト
などです・・・
どなたか教えてください・・・
あと、画像を呼び出す書式もおまけで教えてくれたらうれしいです!

Aベストアンサー

現在作業中のフォルダ(カレントディレクトリ)を確認してみてください。

エラーが出る一文の前に、以下の一文を追加すると、カレントディレクトリが表示されます。

CD
pause

カレントディレクトリが分かったら、そこに呼び出すバッチファイルがあるか確認してください。

又、メインのバッチファイルと同じ場所に「テスト.bat」があるのなら、「call "%~dp0テスト.bat"」と記述しても良いです。

「%~dp0」の意味は、
「%0」が「実行中のバッチファイルのフルパス」を表し、
「~dp」は、「その内のドライブレターとパス」という意味です。
最後は「\」で終わります。

つまり、「実行中のバッチファイルがあるフォルダのパス」という意味になります。

カレントディレクトリは、特にそのバッチファイルに対し何かのファイルをドラッグ&ドロップした場合に注意が必要です。

カレントディレクトリが、バッチファイルのあるフォルダではなくなる可能性があるからです。

その場合は、「pushd "%~dp0"」等の一文を、バッチファイルの最初の方に書いておくと良いかと思います。

これは、「そのバッチファイルがあるフォルダをカレントディレクトリにする」という一文です。

又、フルパスの中に「%」や「^」等が入っていてもエラーになると思いますので、そこもチェックしてみてください。

現在作業中のフォルダ(カレントディレクトリ)を確認してみてください。

エラーが出る一文の前に、以下の一文を追加すると、カレントディレクトリが表示されます。

CD
pause

カレントディレクトリが分かったら、そこに呼び出すバッチファイルがあるか確認してください。

又、メインのバッチファイルと同じ場所に「テスト.bat」があるのなら、「call "%~dp0テスト.bat"」と記述しても良いです。

「%~dp0」の意味は、
「%0」が「実行中のバッチファイルのフルパス」を表し、
「~dp」は、「その内のドライブレ...続きを読む

QC:\_RESTORE\TEMPにはどれくらいのファイルがあるのが妥当ですか?

タイトルそのままなんですけど、当方のパソコンには55500ものファイルが存在し、容量も10G近くにもなっています。ウィルス検索にも非常に時間がかかり困っています。システムでは復元のところチェックいれてるんです。パソコンの動作をスムーズにスリムにするにはどうすればよいでしょうか??アドバイスお願いします。OSはWinMeでHDD40Gメモリーは128Mです。

Aベストアンサー

私も使っていますが、システムの復元は必要無いとおもいます。
要らない復元ポイントを消去したり、コントロールパネル→システム→パフォーマンスのボタンを押す→システムの復元に使うディスクを減らすといいですよ(しかし、古い復元ポイントから消えます。)

Qjavaプログラミングにおけるバッチファイル起動

JavaのプログラムからNetbeansを用いてバッチファイルを起動させることを考えています。
以下のようにプログラムを作成したところ、コマンドプロンプトの画面は表示されるのですが、バッチファイルの中身が起動されません。
どのようにしたらよろしいかお知恵を拝借願います。
public class Open_JTalk {

private Process p;

private void start() {
try {
//String command = "cmd.exe /c start";
String command = "cmd.exe /c start lib/open_jtalk/m001_106.bat";
p = Runtime.getRuntime().exec(command);


} catch (Exception e) {
}
}

public static void main(String args[]) {
Open_JTalk jtalk = new Open_JTalk();
jtalk.start();
}
}

バッチファイルを動かすのみの処理で、
String command = "lib/open_jtalk/m001_106.bat";
とした場合は何も処理されずにプログラムが終了してしまいます。

また、バッチファイルはlib/open_jtalk/に配置済みです。
ディレクトリのbatファイルをクリックで動かした場合には正常に起動しています。

どうかよろしくお願いします。

JavaのプログラムからNetbeansを用いてバッチファイルを起動させることを考えています。
以下のようにプログラムを作成したところ、コマンドプロンプトの画面は表示されるのですが、バッチファイルの中身が起動されません。
どのようにしたらよろしいかお知恵を拝借願います。
public class Open_JTalk {

private Process p;

private void start() {
try {
//String command = "cmd.exe /c start";
String command = "cmd.exe /c start lib/open_jtalk/m001_106.bat";...続きを読む

Aベストアンサー

確認してませんが、

String command = "cmd.exe /c start lib\\open_jtalk\\m001_106.bat";
では?

Windowsの標準コマンド(この場合cmd.exe)のコマンドラインでのパス区切りは \ だけです。
APIレベルでは、/ も使えますが。

QC:\WINDOWS\system32\ntoskrnl.exe が存在しないか壊れている

下記のエラーが表示され Windows が立ち上がりません。

"C:\WINDOWS\system32\ntoskrnl.exeが存在しないか壊れているためWindowsが起動できません。上記のファイルをインストールしてください。"

Windows 2000/XP の緊急修復ディスク (ERD) を作成し、起動試みましたが結果変わりません。

レスキュー方法を教えて下さい。

OS : Windows 2000
Model : FMV 7000FL

[追記]
色々調べているうちに、「これは実際に ntoskrnl.exe や hal.dll が破損している場合よりも、boot.ini の記述が実際の情報と食い違っている場合に発生する」というものを見つけました。
この場合の対処として「boot.ini ファイルの記述を見直してください」とありますがどういうことなのでしょうか?
<http://homepage2.nifty.com/winfaq/w2k/boot.html#1208>

Aベストアンサー

Win2000インストールCDはお持ちですか?

お持ちなら別のPCでBOOT.INIを作りフロッピーなどに保存しておき、
Win2000のCDから起動して回復コンソールのCOPYコマンドでBOOT.INIを上書きさせます、

BOOT.INIの記述は、
オンボードIDEのプライマリマスタの第一パーティションが起動させたいパーティションであれば、

[boot loader]
timeout=30
default=multi(0)disk(0)rdisk(0)partition(1)\WINNT
[operating systems]
multi(0)disk(0)rdisk(0)partition(1)\WINNT="Microsoft Windows 2000 Professional" /fastdetect

となります、

http://nobumasa-web.hp.infoseek.co.jp/multi_boot/windows.html#kaifuku

HDDを取り出して他のPCに接続できるなら、
BOOT.INIを直接編集でも可能。

Win2000インストールCDはお持ちですか?

お持ちなら別のPCでBOOT.INIを作りフロッピーなどに保存しておき、
Win2000のCDから起動して回復コンソールのCOPYコマンドでBOOT.INIを上書きさせます、

BOOT.INIの記述は、
オンボードIDEのプライマリマスタの第一パーティションが起動させたいパーティションであれば、

[boot loader]
timeout=30
default=multi(0)disk(0)rdisk(0)partition(1)\WINNT
[operating systems]
multi(0)disk(0)rdisk(0)partition(1)\WINNT="Microsoft Windows 2000 Professiona...続きを読む

QDOS バッチファイルコマンド記述について

DOSのバッチファイルを利用してコマンドを記述したバッチファイルを作り、
ドロップしたファイルのバイト数を見て1000バイト以上あったら指定のフォルダに
移動させたいと考えています。素人ながらに以下のファイルを作ってみたのですが
うまく動いてくれません。添削して頂けると助かります。よろしくお願いします。

:start
if %1""=="" goto end
if "%~z1" gtr 1000 move "%1" C:\bk
shift
goto start
:end

Aベストアンサー

これでいかがでしょうか。
ファイルをD&Dする場合にディレクトリ名に空白があると""でくくられて渡されるので、%~1を使っています。ただしディレクトリ名に全角空白があるとうまくいかない場合があります。

:start
if "%~1"=="" goto end
if %~z1 gtr 1000 move "%~1" C:\bk
shift
goto start
:end

QC\_restore\のファイルを削除しました

OSはMe

復元をしないと設定した後
ウイルスに感染したC\_restore\のファイルを操作ミスで削除しました。

何か問題はありますでしょうか?
もしフリーズしたらとびくびくしております。
どうかお願いします。

Aベストアンサー

C:\_restore\
はシステムの復元機能が復元ポイントとなった時点でのシステムの情報をバックアップするフォルダです。
ウィルスに感染した場合、ウィルスごとシステムの情報がバックアップされることは良くあります。


> 何か問題はありますでしょうか?

復元ポイントは適当なタイミングで自動的に作成されますから、
「ウィルスに感染していた時期の設定に戻したい」
という事がなければ、問題なしです。

QDOSバッチ処理でファイル名の取得

選択した複数のファイルの名称を取得する目的で、以下の内容のバッチファイルを作成し、(右クリック>送る) で使えるようにしています。
選択するファイル名が少なければ問題なく.txtが作成されるのですが、ファイル数が100を超えると(選択したファイルによって上限が変わる).txtが作成されなくなります。
バッチファイルの内容に問題があるのでしょうか?
アドバイスをお願いします。

:start
if "%~1"=="" goto end

dir /b %1 >> %TEMP%\List.txt

shift
goto start

:end

Aベストアンサー

バッチファイルというのは、実際には、cmd.exe というプログラムが処理の主体です。
そして、右クリックで「送る」とした場合、最終的には、 cmd.exe file1 file2 .... という文が生成されて、これが実行されます。

で、cmd.exe が受け取れる文字数には、上限があります。(おそらく、8196文字)

http://support.microsoft.com/kb/830473/ja

で、この文字列を超えると、それ以降のファイル名が切り捨てられてしまうのだろうと思います。

QC:\_RESTORE\TEMP0021090.CPYにウィルスが~~~

RESTOREにウィルスが~~~感染しました
ウイルスバスター2002をつかってるんですけど
C:\_RESTORE\TEMP0021090.CPYと
C:\_RESTORE\TEMP0025840.CPYとか
C:\_RESTORE\TEMP『数字』.CPY という名前のファイルに
『WORM_BADTRANS.B』が7体感染してしまいました。
消去ができず隔離もできなく 処理できません と表示されます。
ファイル名はわかっていて消去できない~~~なんて
最悪です消去の方法を教えてください。
補足・アドバイス・回答 をお願いします

Aベストアンサー

ここでは書ききれませんので、トレンドマイクロ社の対策WEBをご覧ください。
具体的な駆除方法は記載されていますよ。

駆除方法
http://www.trendmicro.co.jp/esolution/solutionDetail.asp?solutionID=2186

対策WEB Top
http://www.trendmicro.co.jp/badtrans/index.asp

Qバッチファイルについて

バッチファイルを作成して、スカイプとMSNメッセンジャーの同時起動はできるのですが、そのあとに「C:\Windows\system32\cmd.exe」というコマンドプロンプトの画面が3つ出てしまうのですが、これはアプリ起動の後に自動的に消せないものなのでしょうか?教えてください。

(作成したバッチファイル)
start
CD C:\PROGRA~1\Skype\Phone
skype.exe
start
CD C:\PROGRA~1\"Windows Live"\Messenger
msnmsgr.exe
exit;

skype.exeの前にexit;と書いた場合、MSNが起動しませんでした。

Aベストアンサー

以下をbat内に記述して実行して下さい。
Vistaはx64版しか持っていないのでx86版の場合のフォルダ構造は把握していません。
適宜訂正して下さい。
空白はTabではなくスペースキーです。

@echo off
start "" "C:\Program Files (x86)\Skype\Phone\Skype.exe"
start "" "C:\Program Files (x86)\Windows Live\Messenger\msnmsgr.exe"
exit

QC:\WINDOWS\Cookies\index.dat

C:\WINDOWS\Cookiesフォルダーにあるindex.datと言うファイルがクッキーの数が増えていくたびに大きくなっているのですが、
クッキーは削除できるのですが、このファイルだけ削除しようとしても削除できないのです、
とりあえずメモ帳で開こうとしても共有違反で開けないと出てしまいます、

これは何をするファイルなんでしょう?

Aベストアンサー

私も同様の症状で悩みました。index.datが消せない上に、
サイズが大きくなっていくのです。
エディタで強引に開いたところ、やはりcookie関連の情報と
思われるデータでした。

マイクロソフトのサポートセンターに電話して、
担当者と相談した結果、以下の方法で暫定的に
解決いたしました。

1.DOSモードでPCを起動
2.DOSコマンドを使用して、該当ファイルを削除
   cdコマンドで該当ディレクトリに降りる
   delコマンドでindex.datを削除

WinMeを使用している場合は、起動ディスクから
PCを起動して、DOSモードに入る必要があります。
しかし、umechinさんが述べているように、
次にWebにアクセスすると、このファイルはまた作成されます。

私は、定期的に上の方法でindex.datを消しています。
index.datの内容を盗み見るタイプのワームがありますので、
なるべく頻繁に消去しておいた方がよいと思われます。


人気Q&Aランキング