- ベストアンサー
D&Dするとファイル名の一部を取得してくれるバッチ
あるファイル"xxxxx_kbyyyyy_zzzzz.txt"(kbとアンダーバーは固定、x、y、zは文字種・文字数ともに不規則)をD&Dすると、 "kbyyyyy"の部分だけを取得してテキストファイルとして出力するかクリップボードにコピーしてくれるバッチファイルの書き方を教えてください。 よろしくお願いします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
注意点 文字列にスペースがあると動きません 拡張子の判断はしません ちゃんと動作確認してません バッチは得意ではありません ここを参考にしました: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
その他の回答 (4)
- Yune-Kichi
- ベストアンサー率74% (465/626)
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は空白として通すようですが。
お礼
ご回答ありがとうございます。 ファイル名に半角丸括弧が入っていると 動作しないのはどうしようもないのでしょうか? 後出しで大変申し訳ないのですが、 もしご存知でしたらご教示いただけないでしょうか?
- axuaxua
- ベストアンサー率36% (82/223)
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)
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
お礼
繰り返しご回答ありがとうございます。 ファイル名に半角丸括弧が入っていると 動作しないのはどうしようもないのでしょうか? 単一ファイルではfor文の行を消すことで正常動作するのですが、 for文を入れると駄目なので 複数ファイルの処理ができません。 後出しで大変申し訳ないのですが、 もしご存知でしたらご教示いただけないでしょうか?
- Yune-Kichi
- ベストアンサー率74% (465/626)
FOR /Fあたりを使えばできそうな気がします。 %~nx1でファイル名+拡張子だけを取り出すとかが必要になりますが。
お礼
ご回答ありがとうございます。 しかし残念ながらtxtファイルを出力してくれません。。