バッチファイルで以下のファイル操作を行いたいです。よろしくお願いします。

■概要
テキストファイルに書かれているファイルのフルパスの途中のフォルダ名を取得して変数にしたい。
その変数のフォルダを作成し、そのフォルダにファイルをコピーしたい。
■詳細
テキストファイル内容例
 L:\tmp\ope\あああ\Proc\Prog000\Nordet.bbt
 L:\tmp\ope\あああ\Proc\Prog001\Nordet.bbt
 L:\tmp\ope\いいいい\Proc\Prog000\Nordet.bbt
 L:\tmp\ope\いいいい\Proc\Prog001\Nordet.bbt

 上記の各行末から1つ目と3つ目のフォルダ名を取得する。
  1つ目:「あああ」「いいいい」など
  3つ目:「Prog000」「Prog001」

 L:\tmp\ope\XXXX までは変化する。
 Proc は固定。
 ProgXXX は連番(文字数固定)。
 Nordet.bbt は固定。

任意のフォルダにフォルダ「あああ」を作成し、Nordet.bbtをProg000-Nordet.bbt という名称で
「あああ」にコピーする。これを各行で行う。

■試したこと(断念・・・中途半端です。)
for /f %%i in (list.txt) do (set PROC="%%i":~-19,-12% ←ProgXXX の取得
                            ) ←XXXX の取得

よろしくお願いします。

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

あああ」に関するQ&A: あああ嫌だ女の性格

A 回答 (1件)

以下のような感じでしょうか。



パスやファイル名に「%」が含まれる場合には対応していませんので、ご注意ください。

――――――――――――――――――――――――――――

@echo off

set "OutputDir=C:\コピー先フォルダ"

if not exist "%OutputDir%" md "%OutputDir%"

for /F "delims=" %%a in (list.txt) do (
call :Sub1 "%%a"
)

exit /b

:Sub1
set "FilePathTemp=%~1"
set "FilePath=%FilePathTemp:^^=^%"
set "FileNameTemp=%~nx1"
set "FileName=%FileNameTemp:^^=^%"
set "Dir1PathTemp=%~dp1"
set "Dir1Path=%Dir1PathTemp:^^=^%"
pushd "%Dir1Path%"
set "Dir1Path=%CD%"
call :Sub2 "%DIR1Path%"
exit /b 2

:Sub2
set "Dir1NameTemp=%~nx1"
set "Dir1Name=%Dir1NameTemp:^^=^%"
pushd "..\"
call :Sub3 "%CD%"
exit /b 2

:Sub3
set "Dir2NameTemp=%~nx1"
set "Dir2Name=%Dir2NameTemp:^^=^%"
pushd "..\"
call :Sub4 "%CD%"
exit /b 2

:Sub4
set "Dir3NameTemp=%~nx1"
set "Dir3Name=%Dir3NameTemp:^^=^%"
pushd "..\"
if not exist "%OutputDir%\%Dir3Name%" md "%OutputDir%\%Dir3Name%"
copy /b "%FilePath%" "%OutputDir%\%Dir3Name%\%Dir1Name%-%FileName%"
exit /b 2

――――――――――――――――――――――――――――
    • good
    • 0
この回答へのお礼

ありがとうございました。求める結果が得られました。
どのような処理をしているのか、じっくり勉強させていただきます。

お礼日時:2017/04/21 01:19

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

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

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

Qrubyでのproc

rubyでのproc

http://d.hatena.ne.jp/shunsuk/20090101/1230816826

ここのサイトで解説されていることなんですけど,

「同じblockを何度も使いたいときがあります。そんなときに再利用するためのコードがProcです。blockとProcの唯一の違いは、blockは保存できないということです。Procについて見てみましょう。」

とあるのですが,なにをもってblockは保存できないといってるのでしょうか?

「lambdaはメソッドと同じように振る舞いますから、returnを使うことができます。この意味の違いは、下の例に現れます。」

の下にサンプルプログラムがあると思いますが,


puts generic_return(Proc.new { |x, y| x + 2; y + 2 })

puts generic_return(Proc.new { |x, y| [x + 2, y + 2] })

この2行ではエラー処理が行われず,なんらかの出力がされています,

これはなぜでしょうか?メソッドの中にreturnがある限りエラー処理が起こると思っているのですが・・・

あと,あまり関係ない質問になるかもしれませんが

array.iterate!(method(:square))

このような記述のとき,squareは関数名ということはわかるのですが,

:(コロン)これはなにを指すのでしょうか?

よろしくおねがいします.

rubyでのproc

http://d.hatena.ne.jp/shunsuk/20090101/1230816826

ここのサイトで解説されていることなんですけど,

「同じblockを何度も使いたいときがあります。そんなときに再利用するためのコードがProcです。blockとProcの唯一の違いは、blockは保存できないということです。Procについて見てみましょう。」

とあるのですが,なにをもってblockは保存できないといってるのでしょうか?

「lambdaはメソッドと同じように振る舞いますから、returnを使うことができます。この意味の違いは、下の例に現れま...続きを読む

Aベストアンサー

> なにをもってblockは保存できないといってるのでしょうか?

Lambdaの項の最初に“Procを2通りの方法で使ってきました。直接渡す方法と、変数に保存する方法です。”という記述があります。
保存とは変数に保存するということの様です。Procのインスタンスは変数に保存して使い回しができますが、ブロックはできないということではないでしょうか。


> この2行ではエラー処理が行われず,なんらかの出力がされています,
> これはなぜでしょうか?メソッドの中にreturnがある限りエラー処理が起こると思っているのですが・・・

メソッドの中ではなくて、Proc.new{ }の中にreturnがある場合ですね。
この中にreturnがあると、そのProcが定義されたレベルからのreturnを行おうとするようです、このサンプルだとProcはプログラムのトップレベルで定義されているので、トップレベルからreturnしようとしてエラーになっている様です。
要するにProcを使用する場合はreturnを使うな、returnを使う場合はlambdaを使えということではないでしょうか。

> なにをもってblockは保存できないといってるのでしょうか?

Lambdaの項の最初に“Procを2通りの方法で使ってきました。直接渡す方法と、変数に保存する方法です。”という記述があります。
保存とは変数に保存するということの様です。Procのインスタンスは変数に保存して使い回しができますが、ブロックはできないということではないでしょうか。


> この2行ではエラー処理が行われず,なんらかの出力がされています,
> これはなぜでしょうか?メソッドの中にreturnがある限りエラー処理が起こると思っている...続きを読む

Q/(.)(\d\d)+(.)/ =~ "123456"のとき、 p $

/(.)(\d\d)+(.)/ =~ "123456"のとき、 p $2とすると、"45"となるのはなぜですか?
p $2 #=>23 となると思っていました。
そして、いったい23はどうすれば後方参照できるのですか?

Aベストアンサー

(\d\d)+ は、2つの数字の1回以上の繰り返しですから、"23"と"45"にマッチします。
ですから、$2には最後にマッチした"45"を指すことになります。

もし対象の文字列が"12345"であれば、"23"と"45"にマッチさせると最後の(.)にマッチする文字が無くなってしまうので、$2は"23"になりますね($3は"4")

> いったい23はどうすれば後方参照できるのですか?

/(.)(\d\d)/ =~ "123456"
p $2

ではダメでしょうか?

Qdelete("\",")

rubyのプログラムで
文字列変数.delete("\",")
という記述がありました。

これは文字列から何を削除しているのでしょうか・・・。
文字列の中から「",」という文字列を削除しているのでしょうか。

Aベストアンサー

>文字列の中から「",」という文字列を削除しているのでしょうか。
はい。その通りです。
""の中で"を指定するには\"と記述します。
以下のスクリプトを実行すると確認できます。
--------------------------------------
data = "aaa\"bbb,ccc"
puts data
data = data.delete("\",")
puts data
----------------------------
実行結果
aaa"bbb,ccc
aaabbbccc

Qrubyのインスタンスのクラス名取得

現在rubyを勉強しているのですが、わからないことがありこまっています。

それはインスタンスにどんなクラスが入っているかわからないのです。
具体的にソースで説明させていただきます。

f= File.open("hello.txt")

このfのインスタンスにどんなクラスのインスタンスが格納されているか知りたいのですが、何か方法は無いのでしょうか?

Aベストアンサー

f.class

f= File.open("hello.txt") ; puts f.class すると File と表示されます。

なお、言葉の使い方がおかしいです。
少なくとも、「このfの変数にどんなクラスのインスタンスが格納されているか知りたいのですが、」
より正しくは、「この変数fの指しているインスタンスのクラスを知りたいのですが、」

Qテキストファイルの差分を取得するには?

2つのテキストファイルの差分を取得したいと思っています。
rubyを使用してdiffコマンドの様な事は可能でしょうか?
テキストを1行ずつ配列に入れて - で比較していく方法を使用してみたのですが、途中で行数が変わるような変更が起こっていると上手く動作できませんでした。
理想としては一部が変更された行、追加された行、削除された行といった物を取得したいです。
もし上手く解決出来る様な手法がありましたら、ご教示お願いいたします。

Aベストアンサー

diffは結構高度なことをやっているので、同じようなことをやるのは大変です。
それこそRubyからdiffを呼び出せば良いのですが、

それか、diff-lcsというのがありますので、それを使われてはいかがでしょうか。
http://rubygems.org/gems/diff-lcs
rubygemsでインストールできます。他にもdiffから始まるものがたくさん有りますので、利用可能かもしれません。


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

人気Q&Aランキング

おすすめ情報