アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

よろしくお願いします。

A 回答 (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
    • good
    • 0
この回答へのお礼

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

お礼日時:2013/02/26 00:36

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は空白として通すようですが。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
ファイル名に半角丸括弧が入っていると
動作しないのはどうしようもないのでしょうか?

後出しで大変申し訳ないのですが、
もしご存知でしたらご教示いただけないでしょうか?

お礼日時:2013/02/26 20:13

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
    • good
    • 0

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
    • good
    • 0
この回答へのお礼

繰り返しご回答ありがとうございます。
ファイル名に半角丸括弧が入っていると
動作しないのはどうしようもないのでしょうか?

単一ファイルではfor文の行を消すことで正常動作するのですが、
for文を入れると駄目なので
複数ファイルの処理ができません。

後出しで大変申し訳ないのですが、
もしご存知でしたらご教示いただけないでしょうか?

お礼日時:2013/02/26 19:15

FOR /Fあたりを使えばできそうな気がします。


%~nx1でファイル名+拡張子だけを取り出すとかが必要になりますが。
    • good
    • 0

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