「どうせスクリプト書けないんじゃないの?」
と煽ったら、出来はどうあれ相手はスクリプト書ける奴だった
そして「あるいは口だけ」なんて煽るくらいなんだから
お前も書けよと返されるが、実は煽るだけで全く書けない
悔しくて仕方ないのでスレを荒らす、と
そして自分に都合の悪いカキコは903扱い、と
そして俺も、何人目かの903になるのであった
流れを変えて、前にもちょっと出たけどExcelでのリネームってどうよ?
vbsでのリネームに近いけど、シート上で結果を確認してからリネーム出来るし
より細かいこともできる。
自分は以前データベースを使ってリネームする必要が有ったときにExcel使った。
はっきり言って機能的には練馬のマクロなんて足下にも及ばないだろう。
VBAを駆使すれば、全リネームソフトのリネーム機能を網羅することも不可能では無いと思う。
ただ、リネームソフトじゃないので使い辛さも群を抜いてる。
まあExcelでリネームやるくらいならアプリ作れと言われるかも知れないが
Excelの方がまだ敷居は低いし、マクロの追加・書き換えも楽だから。
でもほとんどは正規表現や練馬のマクロで事足りちゃうんだよね。
練馬で無理なことって、マクロ使えば数値・文字列操作系ではほとんど無いし。
>>943 練馬のマクロはあくまで文字列を置き換えるマクロであってスクリプトじゃないからね。
でも
>>919 のやり方でvbsも組み込めちゃうから機能の拡張も自由にできそうじゃない。
>>918 試してみれば分かるけど変換は一瞬だしほとんどコマンド感覚で利用できるよ。
操作の都合上Excelからマクロで1つ2つのファイルのリネームを行うことはあるが
リネームにExcel使おうと思ったことは無いな
そもそも練馬でやろうとしたことが出来なかったことなど俺は一度も無い
つーかあんまり複雑なリネームしないので練馬のマクロすらほとんど使わないな
レス付かないなあと思ってたら夜中に随分と増えてるな。(ほとんどは関係ないレスだが)
>>931 While〜Wend についてはそれだけの理由なの?。(
>>920 と同じかはわからないけど)
互換性とかに関連することなのかなあと思っていたのだが。
ネットだけで調べるの辛いんで安い解説本(ポケットリファレンス)買ったんだけど
1999年初版のこの本でも While〜Wend は普通に紹介されてるし、
>>921 のサイトでも
紹介されているんだけど。C言語使いなんで自分にとっては構文に何の違和感もないし。
柔軟性についてはそのとおりみたいだね。MSDNでもそんなようなこと書いてあった。
ついでに訊きたいけどオブジェクトの解放は Nothing の指定でいいのかな?。
これでリソースが解放されるんだろうけど、これってスクリプトの途中で意図的に
解放したい場合だけやるなんてことはない?。サンプルだと全然やってないんだよねぇ。
繰り返し実行してみてもリソースを食い潰してる感じはないみたいだし。
Cだと new と delete で当然のようにやってるけど、VBSだとどれについてやればいいのやら。
所詮はスクリプトだし正常終了すれば Wscript.exe が後処理してくれるなんてことはない?。
同じく関数前の Wscript.Quit ってのもサンプルだとやってないんだよなぁ。
コーディングイメージはほとんど
>>918 と同じような感じ。
正規表現の関数もMSDNのサンプルを手直ししただけだし。
>>931 更についでに処理方法について訊きたいんだけど。(唯一答えてくれそうな感じなので)
>>929 で言ってる桁保持ってどうやってるの?。
1行だけでできるみたいだけど。
>>918 だと4行でやってるんだけどもっと簡単にできるの?。
桁の繰り上がり(例 99→100)を考慮したらこんな感じになってしまったのだが。
あとテキストファイルの行数の取得って普通はどうやる?。
適当に追加モードでオープンして file.Line-1 で取得してみたのだが。(3〜5行目)
もうひとつ理由がわからないのが For Each のループ。(14〜16行目)
ReDim では行数分配列確保してるのは確認したんだけど何故かループが1回多くなる。
その結果1行余分に出力されてしまってるんだよねぇ。
技術的なネタだと途端に静かになるな
>>946 >>920は知らないけど、俺はそれだけの理由。
でも不特定多数に渡す場合や複数人で開発を行う場合は、
それだけでも避けるに充分な理由だと思う。
動作に不備があるわけじゃないので自分一人で使う分にはどうでもいいけど。
オブジェクトの解放については詳しいことはよくわからんが、
"Excel.Application"を参照して解放しないとプロセス残ったりすることがあるようなので、
俺は一応全て最後に解放してる。
>>947 繰り上がりは見てないよ。
0詰めってのは桁を決める時点で繰り上がりを考慮するのが当たり前だと思ってるので。
NuAdd = Left(strTemp, j - 1) & Right(String(i - j, "0") & Mid(strTemp, j, i - j) + addend,i - j) & Mid(strTemp, i)
1行で繰り上がりに対応出来ないこともないけど、ちょっと強引かな。
一応Right関数の第二引数を「i - j」から「i - j + Len(Mid(strTemp, j, i - j) + addend) - Len(Clng(Mid(strTemp, j, i - j))」
にすれば1行書き換えで繰り上がりにも対応できるけど、もう一行追加した方が効率いいね。
Format関数が使えれば一発なんだが、vbsではFormatNumber関数は使えるのにFormat関数使えないし。
>>947 俺はテキストの行数は取得させずに読んでいくな。
lines = Split(file.ReadAll,vbNewLine)
とかで一括して読み込むかことが多いけど、ループ回す場合なら要素数を多めに決め打ちして
ReDim lines(1000)
Do Until file.AtEndOfStream
lines(i) = AddNum(file.ReadLine)
i = i + 1
Loop
ReDim Preserve lines(i - 1)
テキストが空の可能性もあるなら、最後のReDim前に条件分岐入れないとエラーになる。
要素数上限が全く予測できない場合は、ループの中で
If i Mod 1000 = 0 Then ReDim Preserve lines(i + 1000)
とかで凌ぐけど大抵は多めに決め打ちしちゃう。
Variant型の100000要素一次元空配列でも2MBくらいしかメモリ食わないし。
内容読込はせずに行数だけ必要な場合はLineで取得するけど。
For Eachのループについては、俺はそういう現象に遭遇したことないけど
テキストの末行に空改行があると、余分にループしてるように見えるかも。
>>948 まあ、スレ違いだし。
エクセルでリネームよりも、
Delphiのなんと言ったコンポーネントだったか、
IDEのオブジェクトインスペクタの奴流用したら面白いかなと思ってる。
>>949-950 レスどうも。
While〜Wend はその理由ならこのままでもいいかな。一応
>>920 の理由も聞いてみたいが。
どこに納品するわけでもなく個人用だしね。でもまあ一応 Do〜Loop に変えとくか。
オブジェクトの解放はよくわからんけど一応 CreateObject のだけ最後に解放しておこうか。
特に問題ないような気もするけど。
桁あふれの繰り上がりは見てなかったのか。ということならあのままでもいいかな。
C言語の sprintf みたいに書式編集できるのがないか調べてみたけどそれっぽいのは見つからず
一応 String でのゼロ埋めにしておいたんだけど、考え方はこれで良かったみたいだね。
行数は取得の方法が他にないなら取り合えず今のままでもいいかな。
個人利用なら決め打ちで多めに確保して ReDim Preserve という方法でも確かにいいかも。
でも行数取得しちゃった方が上限気にしないでもいいしね。
For Each のループは原因がわかった。4行目が ReDim lines(file.Line - 2) の間違いだ。
配列の数値って1つ少ないんだな。C言語と同じ感覚で確保してたので1つ余計だったみたい。
ということでメイン処理の修正。 AddNumプロシージャは変わってないので省略。
変数の宣言については気になる人は Option Explicit を書いて厳密にやればいいということで。
tmpfile = WScript.Arguments.Item(0)
Set fs = CreateObject("Scripting.FileSystemObject")
Set file = fs.OpenTextFile(tmpfile, 8)
ReDim lines(file.Line - 2)
file.Close
Set file = fs.OpenTextFile(tmpfile)
i = 0
Do Until file.AtEndOfStream
lines(i) = AddNum(file.ReadLine)
i = i + 1
Loop
file.Close
Set file = fs.CreateTextFile(tmpfile, True)
For Each line in lines
file.WriteLine line
Next
file.Close
Set fs = Nothing
Wscript.Quit
そんじゃ俺もネタ投下
@
Const k = 1 '加算値
Dim FSO, regEx, sPath, sLines, sLine, tsR, tsW
Set FSO = CreateObject("Scripting.FileSystemObject")
Set regEx = New RegExp
sPath = Wscript.Arguments(0)
Set tsR = FSO.OpenTextFile(sPath)
sLines = Split(tsR.ReadAll, vbNewLine)
tsR.Close
Set tsW = FSO.CreateTextFile(sPath)
For Each sLine in sLines
tsW.WriteLine AddNum(sLine)
Next
tsW.Close
Set FSO = Nothing
Wscript.Quit
A
Const FolderRename = -1 '-1:フォルダは無視 0:フォルダ内のファイルをリネーム 1:フォルダをリネーム
Const k = 1 '加算値
Dim FSO, regEx, arg, oItm, oFolder, oFile
Set arg = Wscript.Arguments
If arg.Count > 0 Then
Set FSO = CreateObject("Scripting.FileSystemObject")
Set regEx = New RegExp
For Each oItm In arg
If FSO.FileExists(oItm) Then
Call FileRename(oItm)
ElseIf FSO.FolderExists(oItm) Then
Set oFolder = FSO.GetFolder(oItm)
If FolderRename Then
If FolderRename = 1 Then oFolder.Name = AddNum(oFolder.Name)
Else
For Each oFile In oFolder.Files
Call FileRename(oFile.Path)
Next
End If
End If
Next
Set FSO = Nothing
End If
Wscript.Quit
Sub FileRename(sPath)
FSO.GetFile(sPath).Name = AddNum(FSO.GetBaseName(sPath)) & "." & FSO.GetExtensionName(sPath)
End Sub
B
Function AddNum(sName)
Dim cMatch, i, j
With regEx
.Pattern = "\d+" 'マッチパターン
.Global = True '全体を検索する {True|False}
Set cMatch = .Execute(sName)
End With
If cMatch.Count = 0 Then
AddNum = sName
Else
i = 0 '最初にマッチしたものに加算
'i = cMatch.Count - 1 '最後にマッチしたものに加算
With cMatch(i)
j = .Value + k
AddNum = Left(sName, .FirstIndex) & _
Right(String(.Length, "0") & j, .Length + Len(j) - Len(CLng(.Value))) & _
Mid(sName, .FirstIndex + .Length + 1)
End With
End If
End Function
@は変数宣言入れただけで、やってることは
>>953と同じ。
@+Bで練馬用、A+Bでドラッグアンドドロップ用
>>954-957 いいね。こういうのを期待してた。w
@
全て読み込んでSplitで配列作ればいいのか。これ便利だな。
コードもすっきりするし。オレも採用しよ。w
ただ最後の改行絡みで1行余分に切り出されてしまうのが気になるな。
A
試してないからよくわからんけどvbsへのショートカットを作って
そこにD&Dするってこと?。もし違ったら使い方の説明ヨロ。
B
桁の繰り上がりはそれじゃ桁数保持できないからダメだと思うよ。
○ 009→010
× 009→0010
繰り上がりの意味を勘違いしたのかもしれないけどオレが言ってたのはこの場合ね。
999→1000(桁あふれの場合のみ)
あるいはこっちに対応しようとした結果あっちが変になってしまったのかな?。
>>958 @
For Each sLine in sLines
tsW.WriteLine AddNum(sLine)
Next
↓
For l = 0 To Ubound(sLines) - 1
tsW.WriteLine AddNum(sLines(l))
Next
Dimから sLine を消して l 追加ね。
正確には最後をWriteLineではなくWriteで書き込まなくちゃいけないんだけど、
どうせ空なので削っても問題ないでしょ。というか「Write ""」なんて無駄だし。
A
vbs本体にD&D
B
ゴメン、凡ミスです
99とか9999とかしか見てなかった。
×Right(String(.Length, "0") & j, .Length + Len(j) - Len(CLng(.Value))) & _
○Right(String(.Length, "0") & j, .Length - (Len(j) > Len(.Value))) & _
これで
009 + 1 = 010
999 + 1 = 1000
になると思う。
Aをちょっと修正。
他の用途で使ってたのを引っ張ってきたので、無駄で解り辛い部分があったので。
Const FolderRename = 0 '1:フォルダをリネーム 2:フォルダ内のファイルをリネーム その他:フォルダは無視
Const k = 1 '加算値
Dim FSO, regEx, arg, oItm, oFolder, oFile
Set arg = Wscript.Arguments
If arg.Count > 0 Then
Set FSO = CreateObject("Scripting.FileSystemObject")
Set regEx = New RegExp
For Each oItm In arg
If FSO.FileExists(oItm) Then
Call FileRename(oItm)
ElseIf FSO.FolderExists(oItm) Then
Select Case FolderRename
Case 1
Set oFolder = FSO.GetFolder(oItm)
oFolder.Name = AddNum(oFolder.Name)
Case 2
For Each oFile In FSO.GetFolder(oItm).Files
Call FileRename(oFile.Path)
Next
End Select
End If
Next
Set FSO = Nothing
End If
Wscript.Quit
Sub FileRename(sPath)
FSO.GetFile(sPath).Name = AddNum(FSO.GetBaseName(sPath)) & "." & FSO.GetExtensionName(sPath)
End Sub
@
自分とこでは ReDim Preserve lines(Ubound(lines) - 1) で最後を削っちゃった。
B
VBSでも判定の真偽を計算式に入れたりできるんだね。
真がオールFで -1 ってのも何の違和感もないし。
この感じなら @は練馬の外部ツール用の AはD&Dによるリネーム用の
インタフェース用スクリプトとして固定で使えるようになったかな?。
あとはBを自由に作り変えることでいろいろな変換にも対応できると。
今回作ったのは連番に1加算するという変換機能だけだったけど
他に既存のリネーマーではできないような変換をしたい場合にも
比較的容易に対応できそうだね。
厨なんで全く分かんないけどお疲れ
とりあえずチラシの裏でやってくれたらよかったと思う
dim hoge as チラシの裏
hoge = _
_
"まあ、限定的な物ならまだしも、汎用的なものが出てきたんだからgjだろ" & _
"自分で書くどころか、スクリプト自体を使うことも出来ない奴にはウザいだけかもしれんがなw"
そもそも使いどころが無い。
そもそもVBSなんてつかわねーし
つかえねーしの間違いじゃないの?
自分がスクリプトわからないからってそんなケチつけることもあるまい
じゃあ一応は汎用的に使えるものが形になったということで完成でいいかな?。
VBS使いじゃないんで細かい部分はよく分からんけど、VBS知ってそうな人と
やり取りしながら詰めていったので多分問題ないでしょ。
取り合えず動作には問題ないことは確認できているので
あとはVBSに詳しい人で気になる箇所があれば各自直せばいいし。
VBS知らなくてもテキストファイルにコピペすればこのままで動くけど
もし修正したいなら
>>921 に挙げたサイトを参考にしてみれば
多分すぐに分かると思うよ。
実際2〜3時間くらいコードとサイトの解説&サンプルを見比べてたら
それなりにではあるがどうにかなったし。
まあ必要ない人にとってどうでもいいのは他のリネーム処理についても同様なわけで
スレに残しておけばそのうち誰かに必要が出た場合には何かの参考にはなるでしょ。
とは言ってもこのスレもそろそろ終わりだし過去ログで見れなくなりそうではあるが。w
それじゃこの辺でここまでの一連の流れにピリオドを。
質問し辛くなるんで黙っていたけどオレが 902 ね。(スマン!)
>>901 のレスを見て
「VBSわかるならチャチャッと書いて貼ってやりゃいいじゃん、ケチ臭いなぁ」
と思ってつい煽っちゃった。 ゴメンねぇ。
でも一応責務は果たしたということでいいでしょ?。
>>903 何となく相手してくれてた人が
>>903 だったんじゃないかという気もするけど。w
スクリプトの内容でレス付けてくれてるのは殆んどいなかったような感じだしな。
叩き台になるようなコード載せておけば誰か乗って来るんじゃないかと期待していたのだが
>>954-956 以降で一応目的は達したので(VBS歴が数日のオレのコードより確かでしょ)
そろそろ退散することにしますヮ。
オレにとってもVBSが意外と便利なことが分かったので一応の収穫もあったし。
>>967 VBS使うメリットってあんの?
JScriptかDMonkeyしかつかわねんだけど。
> VBS使うメリットってあんの?
・Win98以降なら標準で使える。(これはJScriptも同じだけど
・JScriptより文字列操作が扱いやすい
・VB、VBAなどがJAVAより広く普及してるので馴染みがある
逆にデメリットもあるけどな
というかVBScriptもJScriptもWSHを使う上での手段でしかないんだよね
というか「JScriptかDMonkeyしかつかわねんだけど。」なんてのは小学生でも書ける
本当にそれらを使ってるなら、JS使いやD-Mon使いの為にスクリプト書いて貼ってくれよ
ハッタリじゃなければの話だけど。それともスレ汚すだけだとか言って逃げるのかな?
と、ブーたれてばかりいる夏厨を煽ってみるテスト
さて煽りを結果で返す実力があるかどうか…
じゃあお言葉に甘えて逃げさせてもらうよw
いい加減すれ違いだし、俺もな。
スレ違いを理由にしているけどリネームに関することならスレ違いじゃないだろ。
VBSだってリネーム処理の話の流れで出てきただけで別にスクリプトだけの話じゃなかったじゃん。
でも自信がないなら早めに逃げてくれた方が有難いな。ウダウダ言い訳されても邪魔なだけだから。
長文レスいい加減ヤメレ
コード書けたんじゃん。<902
で、どう見ても
>>971 って
>>903 だよな?。
今度は
>>970 にターゲット変更か?。
偉そうなものの言い方は相変わらずみたいで
スキルを鼻に掛けるタイプみたいだな。
この結末は予想外
漏れ的には想定内
で、ここは何のスレ?
前から少数が妙に頑張ってる感じのスレとは思っていたが
スキル自慢と煽りあいしかやらなくなったか。
以前も正規表現を知ってることで偉そうにしてる香具師はいたし
それが今回はスクリプトになっただけでないの。
>>954-956 みたいに結果として使えるものを残してくれるならいいよ。
でも
>>903 みたいな単に自慢して終わりなんてのはいらない。
>>980 結果的に煽ってるだけのおまえも、
おまえ自信が「いらない」と言ってる奴と同レベルだってことに気付け。
と 903 が申しております
いい加減どうでもいいからWSHスレでオナニーしててくだちい
折角良いネタ出して流れ変えてくれた人がいるのに
終わった話題をぶり返すとは、空気読めないガキはこれだから困る
それとも自分が話題に付いていけないのがそんなに悔(ry
スクリプトネタも区切り付いたというのに、そのすぐあとに
同じようなことを繰り返そうとしている
>>971 がイカンよ
ちっとは自粛汁
お前も低質な煽りは自粛汁
と 971 が申しております
こんなこと言うと903や971に仕立て上げられそうだけど
未だに903や971を引っ張り出してる子たちって可哀相だと思う
今それらを引っ張り出したからと言ってこのスレに何かメリットあるの?
自分が煽ってる相手以下に落ちたくなければもう少し考えて書き込むことだね
良質なネタ持ってこいなんて、無理なことは言わないから
荒れるネタ振りしか出来ないならせめて黙ってろってことですな。
あ俺もかw
荒れるネタ振りしてんのは903や971も同じだろ。
971なんて自ら煽りって認めてんじゃん。
それをガキみたいにいつまでも引きずるなってーの