• ベストアンサー

D&Dするとファイル名の一部を取得してくれるバッチ

あるファイル"xxxxx_kbyyyyy_zzzzz.txt"(kbとアンダーバーは固定、x、y、zは文字種・文字数ともに不規則)をD&Dすると、 "kbyyyyy"の部分だけを取得してテキストファイルとして出力するかクリップボードにコピーしてくれるバッチファイルの書き方を教えてください。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • axuaxua
  • ベストアンサー率36% (82/223)
回答No.2

注意点 文字列にスペースがあると動きません 拡張子の判断はしません ちゃんと動作確認してません バッチは得意ではありません ここを参考にしました:http://d.hatena.ne.jp/jak-san/20090305/1236256670 batと同じディレクトリにあるout.txtに追記します echo off for %%a in (%*) do call :sub "%%a" exit /b :sub set fname=%~n1 set n=0 :loop call set c=%%fname:~%n%,1%% set /a n=n+1 if "%c%"=="" goto :EOF if "%c%"=="_" goto break goto loop :break call set cname=%%fname:~%n%%% set n=0 :eloop call set c=%%cname:~%n%,1%% set /a n+=1 if "%c%"=="" goto :EOF if "%c%"=="_" goto :break2 goto eloop :break2 set /a n-=1 call set newname=%%cname:~0, %n%%% echo %newname% >> %~dp0out.txt goto :EOF

sasaki_sakichan
質問者

お礼

ご回答ありがとうございます。 しかし残念ながらtxtファイルを出力してくれません。。

その他の回答 (4)

回答No.5

FOR /Fで解析するのは,「ファイル名」を「_」で分離する,という作業です。 あとは,真ん中引っ張ってくればよいので…… @ECHO OFF REM 環境変数の変更をこのバッチファイル内に留め,拡張機能と遅延展開を有効にする SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION REM 出力ファイル名 SET OUTPUT=%~dpn0.txt :LOOP IF "%~1"=="" GOTO :EOF REM 対象のファイルの拡張子は.txt固定 IF "%~x1"==".txt" (  REM ファイル名を_で分割  FOR /F "delims=_ tokens=1,2,3,4 usebackq" %%A IN (`echo %~n1`) DO (   REM _は2つ,つまり3分割されたはず。4分割以上だったり2分割以下の場合は処理しない   IF "%%~D"=="" (    IF NOT "%%~C"=="" (     REM T1 : 真ん中の部分     SET T1=%%B     REM T2 : T1の最初2文字     SET T2=!T1:~0,2!     REM 出力するのは,最初2文字がkbの場合のみ     IF "!T2!"=="kb" ECHO !T1!>>"%OUTPUT%"    )   )  ) ) REM D&Dされた別のファイルも見るために,SHIFTする SHIFT GOTO LOOP でできあがり。インデント用にU+3000を使っているので,適宜U+0009なりU+0020なりに置き換えて下い。 # U+3000をcmd.exeは空白として通すようですが。

sasaki_sakichan
質問者

お礼

ご回答ありがとうございます。 ファイル名に半角丸括弧が入っていると 動作しないのはどうしようもないのでしょうか? 後出しで大変申し訳ないのですが、 もしご存知でしたらご教示いただけないでしょうか?

  • axuaxua
  • ベストアンサー率36% (82/223)
回答No.4

no2です、コード間違えました。ファイル名に空白があるとやっぱり動きません。 for %%s in (%*) do call :sub %%s exit /b :sub for /f "usebackq delims==" %%a in ('%*')do call :main %%a exit /b :main set fname=%~n1 set n=0 :loop call set c=%%fname:~%n%,1%% set /a n=n+1 if %c%=='' goto :EOF if %c%==_ goto break goto loop :break call set cname=%%fname:~%n%%% set n=0 :eloop call set c=%%cname:~%n%,1%% set /a n=n+1 if %c%=='' goto :EOF if %c%==_ goto break2 goto eloop :break2 set /a n=n-1 call set newname=%%cname:~0,%n%%% echo %newname% >> "%~dp0out.txt" goto :EOF

  • axuaxua
  • ベストアンサー率36% (82/223)
回答No.3

no2です フォルダ名にスペースがあると動かないようですね。改良版です 私の知識ではスペース以外が原因だと直せません。ていうか原因が特定できません echo off FOR /F "usebackq delims==" %%a IN (%*) DO call :side %%a :sub set fname=%~n1 set n=0 echo %fname% :loop call set c=%%fname:~%n%,1%% set /a n=n+1 if %c%=='' goto :EOF if %c%==_ goto break goto loop :break call set cname=%%fname:~%n%%% set n=0 :eloop call set c=%%cname:~%n%,1%% set /a n=n+1 if %c%=='' goto :EOF if %c%==_ goto :break2 goto eloop :break2 set /a n=n-1 call set newname=%%cname:~0, %n%%% echo %newname% >> "%~dp0out.txt" goto :EOF

sasaki_sakichan
質問者

お礼

繰り返しご回答ありがとうございます。 ファイル名に半角丸括弧が入っていると 動作しないのはどうしようもないのでしょうか? 単一ファイルではfor文の行を消すことで正常動作するのですが、 for文を入れると駄目なので 複数ファイルの処理ができません。 後出しで大変申し訳ないのですが、 もしご存知でしたらご教示いただけないでしょうか?

回答No.1

FOR /Fあたりを使えばできそうな気がします。 %~nx1でファイル名+拡張子だけを取り出すとかが必要になりますが。

関連するQ&A

  • フォルダ名をファイル名の先頭に追加できるバッチ

    例えばDドライブ直下にAからZまでの26個のフォルダがあり、例えばフォルダAの中に01から99までの連番で01.txt~99.txtと言うものがあったときに、バッチファイルのアイコンにフォルダAをドラッグアンドドロップするとフォルダ内のファイルがA01.txt~A99.txtと言うファイルが生成される、なお、フォルダはAからZまでまとめてバッチファイルのアイコンにドラッグアンドドロップしたらファイル名をリネームできるものを希望します、そのようなバッチはどのように作ったらよいのでしょうか。 当方の環境はwindows7 HomePremiam 64bitです。

  • バッチファイルでクリップボードの文字を使う

    バッチファイルにて フォルダを作成し、ファオルダの名前にクリップボードにコピーされている文字を使いたいのですが、お分かりの方、教えてください。お願いいたします。

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

    バッチファイルについて バッチファイルの勉強をしておりますが、以下のバッチで 分からない箇所があります。 @echo off copy C:\bin\set.txt set.txt | find /v "コピー" echo ユーザー名を入力してください echo 入力後、Ctrlキーを押しながらZキーを押した後、Enterキー copy con inp.txt | find /v "コピー" copy set.txt+inp.txt setinp.bat | find "○○" call setinp.bat echo ユーザー名は%INP%と入力されました! del setinp.bat set.txt inp.txt <<不明箇所>> まず、C:\bin\set.txt』は set INP= とだけ書いたファイルです。 copy C:\bin\set.txt set.txt | find /v "コピー" ですが、|find /v"コピー"はなんのためにやっているのでしょうか?? find /vを調べてみると、指定した文字列を含まない行の内容をすべて画面に表示します。 と記載されていますが・・・・このバッチでは一体なぜ最初にいるのでしょう?? copy con inp.txt | find /v "コピー" ですが、コンソールから入力させた文字列をinp.txtに保存しているらしいのですが、 そのあとに、また、|find /v"コピー"がでてきますが、なぜでしょう??なにを したいのでしょう?? さらにまた、copy set.txt+inp.txt setinp.bat | find "○○"が出てきますが、 ここでなぜまた意味不明な、|find"○○"がでてくるのでしょう?? さらにさらに、バッチを実行してみると、set.txtの中身にはコンソールから 入力した文字は何も記載されていない、そして、inp.txtやsetinp.txtという テキストファイルも、どのフォルダにも出来ていません。 最後の行のdel setinp.bat set.txt inp.txtを消して実行してみても同じです。 なぜでしょう?? このバッチの動き、例としての意図が全く分かりません。。。。 この例題が悪すぎるのか、私の頭がわるすぎるのか・・・・ ちなみに、上記バッチは、http://www.geocities.co.jp/SiliconValley-SanJose/1227/batinput.html のサイトのものです。 どなたかご教授願います。。。一週間悩みましたが、まったく理解できない状態です。。。

  • バッチファイル 2ファイルをfor /f処理したい

    バッチファイルで別の2つのファイルを読み込んでfor /f処理するには 変換前のファイルのファイル名と 変換後のファイルのファイル名が それぞれ別のファイルに書かれていて この2つのファイルを読み込んで リネームするバッチファイルを 記述したいのですが 2つのfor /fを使った場合、 一方が他方にネストされてしまうのですが このような場合は どのように記述するのでしょうか。 例えば、 変換前のファイル名が書かれたファイル(s.txt)と 変換後のファイル名が書かれたファイル(d.txt) がある場合、 abc.txtをqrs.txt d f.txtをtuw.txt ghi.txtをx z.txt  : にリネームしたいのですが もちろんtest1.batではうまくいきません。 ---test1.bat------------------- for /f %%a in (s.txt) do for /f %%b in (d.txt) do ren "%%a" "%%b" ------------------------------ ---s.txt---------------------- abc.txt d f.txt ghi.txt : ---d.txt---------------------- qrs.txt tuw.txt x z.txt : ------------------------------ 以下の sd.txt のように1つのファイルにして test2.bat のようにすればできますが s.txt と d.txt の2つのファイルのままで処理するには どのように記述すればよいのでしょうか。 ---test2.bat------------------- for /f "tokens=1,2 delims=," %%a in (sd.txt) do ren "%%a" "%%b" ---sd.txt---------------------- abc.txt,qrs.txt d f.txt,tuw.txt ghi.txt,x z.txt : ------------------------------- よろしくお願いします。(Windows7)

  • バッチファイルでテキストファイルの文字列を取得したい

    すみません、どなたか教えて下さい。 バッチファイル(test.bat)内で、他のテキストファイル(ok.txt)の文字列を取得したいです。 ok.txtは 20070614 TEST となってます。 この2つの文字列をそれぞれで取得する方法を教えて下さい。 よろしくお願い致します。

  • バッチファイル 指定ファイル

    お世話様です。 あるバッチファイルの作成に困っております。 『D:\test』フォルダに下記の3ファイルがあります。 ・CS_090609.txt ・CS_090603.txt ・CS_081215.txt があり、数字の部分は作成された日を表しております。 上記ファイルだと、上から2009/6/5・2009/6/3・2008/12/15に 作成されているとします。 今年の6月9日にあるバッチファイルでCS_090609.txtをそのまま残し それ以外のCS_090603.txt・CS_081215.txtをいったん『D:\test\bkp』フォルダに コピーし、その後、『D:\test』フォルダにある090603.txt・CS_081215.txtを削除 する処理を実施したいのですが、どうもうまく作成出来ません。 せいぜい自分のスキルでは、CS_*.txtですべてのファイルを『D:\test\bkp』にコピーし、 その後、『D:\test』フォルダにあるすべてのファイルの削除しかできません。 お手数ですが、何かご教授願いますでしょうか? ※サンプルコードがあると、助かります。 何卒宜しくお願い致します。

  • 【バッチプログラム】フォルダ内のファイル名から削除対象を決める

    OS:XP_SP3 TESTフォルダには、日付が頭についたTXT形式のファイルがあります。(例:20091011_XXXXX.txt) バッチを使用して、今日から30日前のファイルの削除を自動化したいと思っています。 ファイル名と現在日付を比較して削除対象を指定することができるのではないと思っています。 どうかご教授お願い致します。

  • MS-DOSバッチファイルコマンドのrenを使用してファイル名を置換することができない

    MS-DOSバッチファイルコマンドのrenを使用して sample1__01.txt と sample2__02.txt の __(アンダーバー2個)を_test_に置換して、sample1_test_01.txt とsample2_test_02.txt が 自動でできあがるようにしたいのですがうまくいきません。 見よう見まねで ren *__*.txt *_test_*.txt と書いて実行させてみたのですが sample1__test_.txt と sample2__test_.txt となってしまいます。 どうすれば思いどうりの結果を得ることができるのでしょうか? ご存知の方がおられましたらご回答をよろしくお願いします。

  • ファイルの最後に文字列挿入

    複数テキストファイルの最後に、固定の文字列(1行)を追加したいのですが、batファイルで行う場合は、どのようにすれば良いのでしょうか? 例) AAAA.txt BBBB.txt CCCC.txt (ファイルの中身はそれぞれ異なるが拡張子は同じ)3つのファイルの最後に、 XXXXX=YYYY+ZZZZZ という1行を追加したい。 お手数をおかけします。よろしくお願いいたします。

  • バッチファイルでサブディレクトリィにコピー

    あるディレクトリィで以下のバッチファイルを実行し、サブディレクトリィの一番深い階層にあるフォルダに、同じファイル(zzz.txt)をコピーしようとネットで調べたりして、以下のバッチファイルを実行してもうまくいきません。どうしたらいいか教えてください。よろしくお願いします。 for /d %%d in (*) do cd %%d for /d %%a in (*) do copy zzz.txt "%%a\"