WindowsScript(でなくてもいいんですけどね!)を使用して、Cドライブ直下にある、テキストファイルの最下位に「3行」文字を追記したいのですが、どなたかサンプルスクリプトを頂けないでしょうか?修正履歴としてこのファイルの最下位にどんどん追加していくような仕組みがほしいのですが・・・
名無しさんへ
Nomuさんへのお返事が遅れていることは申し訳ないと思っていますが、
言い訳をさせていただきますと、
次の質問をした時点で、書き込みしていただいていることにきずきませんでした。
すみません。
しかしその後、教えていただいたメソッドを調べ、どうするかな、
と考えているうちに別のことをしなければならなくなり、
未だ試していない状態でした。
遅れてしまったことは申し訳ないのですが、
私としては
〜〜の用にしたらうまくいきました、
とお返事したかったので遅れていたのです。
(単にありがとうございます、の返事はスレ汚しと思いましたの)
それから安易に質問しているように思われてしまっていたらすみません。
私なりに過去ログをいろいろ検索して、それでもわからないことを聞いているのです。
もちろんWEBでも検索しています。
逆にお聞きしたいのですが
参考書ですが、JAVAやC言語、シェルスクリプトとちがってなかなか良いものがないと思うのですが、
良いモノを知っていますか?
WEBで調べたら1冊しかでてきませんでした。
また図書館には一冊もありませんでした。
あと
書き込みを見た、と仰っているのですが、
私がレスをしているところはすべて見ていただけましたか?
〜の用にしたらうまくいった、と書いてきたつもりです。
今回のことだけでそういわれたのであれば、心外です。
>うにさん
老婆心ながら一言申し上げます…
>うに さん (null) 2005年 08月 17日 18時 48分 29秒
の書き込みに対する回答を
>Nomu さん 2005年 08月 17日 19時 14分 37秒
がして下さっていますよね。
この場合、次の質問がある際でも、一言お礼を述べてから別の話をするのが礼儀ではないでしょうか。。。
これは、「解決したんだからそんなのいいじゃん!」という話ではなく、次に同じ疑問を抱えてこの掲示板にたどり着いた人が容易に解決方法を見つけられるように、ということです。(まだ解決していない場合でもその旨報告する必要があるかと)
というよりも、先日からのうにさんの書き込みを見ていると、ここに安易に質問を書き込むよりも、お手元に参考書を一冊置いて開発を進められた方が効率的にもご自身の為にも良いケースではないかなぁと感じてしまいます。
またまた失礼いたします。
小さなスクリプトをいくつも書いて、
一つのスクリプトで、これらの小さなスクリプトを一気に流したいのですが、意図した動きにならず、困っています。
【例】
(count1.vbs)
WScript.Echo("Start1")
for i=1 to 10
WScript.Echo(i)
WScript.sleep(1000)
next
(count2.vbs)
WScript.Echo("Start2")
for j=11 to 20
WScript.Echo(j)
WScript.sleep(500)
next
(start.vbs)
set objShell = WScript.CreateObject("WScript.Shell")
set objExec = objShell.Exec("cscript count1.vbs")
set objExec = objShell.Exec("cscript count2.vbs")
例えばこのような感じなのですが、
これだと、count1,count2が実行されてなにも表示がないためわかりません・・・
runメソッドを使ってみたところ、同時に始まってしまいました。
unixのシェルのように順番で実行したいのですが・・・
要するにフォルダ名が欲しいんですよね?
GetParentFolderNameは使えませんか?
絶対パスの取得(シェルで使う、pwd)
今いる場所を取得したいのですが、
息詰まってしまいました。
WScript.scriptfullname
というのがあったのですが、これだと、VBSのファイル名まで取得してしまうのでうまくありません。
scriptnameで名前だけを取得して、scriptfullnameから引けばいいかと思ったのですが・・・
何かうまい方法はないでしょうか。
>>140-21 うに 2005/08/11 17:20
>>Function out(com)
>> Set objShell = WScript.CreateObject("WScript.Shell")
>> Set objExec = objShell.Exec(com)
>> Do Until objExec.StdOut.AtEndOfStream
>> out = out + objExec.StdOut.ReadLine & vbNewLine
>> loop
>>End Function
>管理人むたぐち さん 2005年 08月 11日 20時 08分 23秒
>WshScriptExecオブジェクトのStdOutプロパティではなく
>StdErrプロパティを使ってください。
一瞬とまどったのですが
str = objExec.StdOut.ReadAll
str = str + objExec.StdErr.ReadAll
とすることで解決できました。
いつもありがとうございます。
>ばんのしゃーによかばんた さん 2005年 08月 11日 21時 03分 42秒
ReadAllという便利なメソッドがあるのですね。
ReadLineで最終行まで読み込まないとだめだと思いこんでいました。
とりあえず動くものを作りたかったので、横着してしまいました。
ご指摘ありがとうございました。
今後気をつけたいと思います。
管理人むたぐちさま
お返事が遅れてしまいすいません。
無事コンソールがでないようになりました。ありがとうございました。
秒以下のことについてですが、皆様の意見からまず、必要かどうかを
調べてみます。
MSH Scripting というサイトを開設しました。
http://www.roy.hi-ho.ne.jp/mutaguchi/msh/index.html
タイトルどおり、MSHに関するノウハウを集めるサイトにしていこうと思います。とりあえずはインストールの仕方まで書きました。掲示板もあったほうがいいかなぁ?
》ばんのしゃーによかばんた さん 2005年 08月 14日 16時 44分 57秒
>>過去の業務経験からいえば、*.WSCファイルについては、
あー。これ、*.WSFの間違いです。*.WSCの上限は測定していません。
>>512KB(つまり、524,288バイト)が上限のようです。
>凄い業務ですね。
>512KBと言えば、7K行(step)でしょうか。これくらいだと、
実際のスクリプト量は大したこと無いんですよ。
<resource id="〜"></resource>に XMLデータを埋め込んで出力するような
Webアプリになっていました。大きいのはこのデータ部のサイズだけ。
埋め込まれたデータは、スクリプト部のgetResource("〜") で取得され、
それを Excel等に書式付きで展開させる仕組みになっています。
# 512KBを超えたときには、データ部に URL だけを埋め込むようにし、
# サーバ上にキャッシュされたリソースをダウンロードして展開。
訂正。<html>→<head>など。
>魔界の仮面弁士 さん 2005年 08月 10日 12時 49分 55秒
>》ニモ さん 2005年 08月 10日 00時 20分 49秒
>> 秒以下の時間を取得する方法はあるのでしょうか?
>.NETの存在を忘れていました。
それより、JScriptの存在を忘れていました。
というか、単によく知らなかっただけですが。
JScriptを使っている人に言っても仕方がないので、
VBScriptから使う方法で。WSFやHTMLなら直に。
Dim SC
Set SC=CreateObject("ScriptControl")
SC.Language="JScript"
Set d=SC.Eval("new Date()")
WScript.Echo d.getHours()&":"&d.getMinutes()&":"&d.getSeconds()&"."&d.getMilliseconds()
JScriptの方は、設計がしっかりしているみたいで、
VBScriptのDate/Timeのような問題は生じにくくなってますね。
>魔界の仮面弁士 さん 2005年 08月 11日 16時 15分 21秒
>過去の業務経験からいえば、*.WSCファイルについては、
>512KB(つまり、524,288バイト)が上限のようです。
>ファイルサイズが、これを1バイトでも超えると実行できなくなります。
凄い業務ですね。
512KBと言えば、7K行(step)でしょうか。これくらいだと、
一通り読んで内容を大雑把に把握するだけで、3週間は掛かりそう。
また、作るには、すべて含めて20人月、コーディングだけで4人月くらい?
そんなに大きくて、性能的に大丈夫なんですか?
パーズするだけでも、時間を喰いそうですが。
>ppp さん 2002年 09月 27日 19時 17分 32秒
>HTAに「ある時期が来たらすべての関連ファイルを削除する」という機能を持たせたく、
>このような削除functionを書いてみました。
>ところが、このHTAそのものがこのfolderPath直下にあるためにどうしても削除できません。
>このHTAそのものも含めて削除する手段は何か無いでしょうか?
甲案
<html>
<html>
<script language=vbscript>
Sub Cleanup()
PATH=location.pathname
PATH=Left(PATH,InStrRev(PATH,"\"))
PATH=Replace(PATH,"%20"," ")
If vbOk=MsgBox(PATH&vbLf&"",vbExclamation+vbOkCancel+vbDefaultButton2,"削除します...") Then
Set wShell=CreateObject("WScript.Shell")
wShell.Run "CMD.EXE /C CD \ & RMDIR /S """&PATH&""""
End If
close
End Sub
</script>
</html>
<body>
<button onclick=Cleanup>Cleanup</button>
</body>
</html>
※お好みで
確認なし /Q
WindowStyle 0
乙案
<html>
<html>
<script language=vbscript>
Sub Cleanup()
PATH=location.pathname
PATH=Left(PATH,InStrRev(PATH,"\")-1)
Set wShell=CreateObject("WScript.Shell")
wShell.CurrentDirectory="\"
wShell.Run "MSHTA.EXE vbscript:execute(""PATH="""""&PATH&""""":If vbOk=MsgBox(PATH,vbExclamation+vbOkCancel+vbDefaultButton2,""""削除します..."""") Then:CreateObject(""""Scripting.FileSystemObject"""").DeleteFolder(PATH):End If:close:"")"
close
End Sub
</script>
</html>
<body>
<button onclick=Cleanup>Cleanup</button>
</body>
</html>
>魔界の仮面弁士 さん 2005年 08月 12日 03時 13分 28秒
>WISWIG……という言葉は初めて聞きました。「WYSIWYG」とは別物?
typoです。なんか繋りがないような気がしてました。
>そもそもは Win32 で、プロセスごとにメモリ空間を独立させたのが原因ですよね。
>それ自体は、OSの安定性という点から見れば、大きな意義のある事ですが、
それはよいけど、メッセージングと整合してないところが問題かな。
>(EM_GETTEXT などの)昔からのメッセージが、ポインタに対する操作であるにも
>関わらず、プロセス間で読み書きできる点については、それらがWin16との互換性を
>意識して、例外的に「特別扱い」した結果なのだと思います。
これは整合性が取れています。指定アドレスを間違えても自空間を壊すだけ。
>で、それらはあくまで特例だったので、新しく追加された LVM_GETITEM 等に
>ついては、通常どおり、共有メモリ経由でなければ読み書きできない事に
>したのだろう……と想像してみたり。
そしてメッセージが他空間へ飛ばないようにすれば、整合が取れるのですが、
他空間にメッセージを飛ばして、他空間のメモリを壊すので、
かえって、OSの信頼性を低下させてるだけだと思います。
Windowsのメッセージングは権限/セキュリティの観念が薄いですね。
昔、作ってたメッセージベースOSでは、サーバ空間がケーパビリティを渡した
クライアント空間からしかメッセージが送れなかったです。
ま、そういうOSは高信頼ではあるけど、こういうツールは絶対に作れないので、
痛し痒しです。
>――って、Scriptingな掲示板で話すネタでは無いかな。
すみません。
>ちゃっぴ さん 2005年 08月 11日 22時 53分 26秒
>通常に比べて3割ほど低い計測値が得られる。
優先度が上がって早く終わった。とか。ないですかね。
Windowsは知りませんが、昔のメインフレームでは、
パーフォマンスグループ/ドメイン制御とかで、
ユーザの操作から一定時間は、優先度の高いパーフォマンスグループで回し、
段々低いグループに落として行きました。最低はバッチ。
なので、バッチで時間の掛かる処理を、〆切で急いでいるときなど、
TSSで実行して、ときどき、操作しては優先度を上げてました。
掲示板を無駄に消費させてしまい申し訳ありませんでした。
解決しました。
Dim RetVal
RetVal = Shell("WScript.exe C:\aaa.vbs")
すいません。再度投稿です。
Access2000のボタンのクリックイベントで C:\aaa.vbs を実行を
させたいのです。aaa.vbs にはファイル操作の記述があります。
この操作は vbs の方が楽だったため VBA では書いていません。
Shell関数を使うと可能そうなのですが、次の記述では実行時エラー5、
プロシージャの呼び出し、引数の不正とエラーが出ます。
RetVal = Shell("excel.exe", 1)でエクセルは起動できます。
vbsは直接実行させられないのでしょうか?
Dim RetVal
RetVal = Shell("C:\aaa.vbs")
WinXP pro
Access2000
よろしくお願いします。
>曇り空さん
具体的な情報(環境や実行方法、発生したエラー等)をほとんど示さずに、丸投げで解決を迫っても誰も回答できませんよ。
質問者、回答者、後にこの掲示板を閲覧する利用者、全ての人に利する為の投稿をお願いします。
お世話になります。
Access2000 から C:\aaa.vbs を実行させたいのですが、
Shell関数を使用しても動いてくれませんでした。
Dim RetVal
RetVal = Shell("C:\aaa.vbs")
ご教示いただければと思います。よろしくお願いします。
>魔界の仮面弁士 さん 2005年 08月 10日 10時 32分 37秒
>》ニモ さん 2005年 08月 10日 00時 20分 49秒
>> 秒以下の時間を取得する方法はあるのでしょうか?
>VBScriptのTimer関数は、「午前0時からの経過秒数」を
>小数点以下も含めて返しますので、下記のようにして
>求める事はできます。正確な値ではありませんけど。
>D = Timer - ((Hour(Time) * 60 + Minute(Time)) * 60 + Second(Time))
これは、比較的、分かり易かったのですが、
>ニモ さん 2005年 08月 10日 00時 20分 49秒
>DateとTimeを利用すれば20050809221030までは取得できる
以下のようなコードは、普通に使ってそうで、危ないですね。特に夜型のひと。
WScript.Echo Date,Time
これは、何て言うのか、FCB(Frequently Committed Bugs)?みたいなのに
載ってそうな有名な話ではないでしょうか?
正しい方法も、定石で有りそうですが、
Do
d=Date
t=Time
Loop Until d=Date
WScript.Echo d,t
でしょうか。
Nowを使えば、
dt=Now
d=Fix(dt)
t=CDate(dt-d)
WScript.Echo d,t
リトライ不要で、よいかも。
>D = Timer - ((Hour(Time) * 60 + Minute(Time)) * 60 + Second(Time))
のほうは、Dateが不要ならば、
t=Timer
D = t - Fix(t)
Dateも使うときは、
Do
d=Date
t=Timer 'Timeは使わない。tから作る。
Loop Until d=Date
D = t - Fix(t)
>ばんのしゃーによかばんた さん 2005年 07月 27日 16時 30分 58秒
>で、ボタンなしダイアログは、IEやHTAを使えば出来そうです。
MSHTA.EXEを使って、作ってみました。xボタンもありません。
――――――――――――――――――――――――――――――――――――――
Option Explicit
Dim Text
Dim Title
Dim oMsgBox
Text="何かの処理中です。"
Title="タイトル"
Set oMsgBox=ModelessMsgBoxWithoutButton(Text,Title)
MsgBox "何かの処理の代わり"
oMsgBox.Terminate '処理中メッセージを閉じる。
WScript.Quit
Function ModelessMsgBoxWithoutButton(Text,Title)
Dim wShell
Dim oExec
Set wShell=CreateObject("WScript.Shell")
Set oExec=wShell.Exec("MSHTA.EXE ""javascript:moveTo(100,100);resizeTo(200,120);function window.onload(){document.body.innerText=new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(0).ReadAll();}'<hta:application sysmenu=no innerborder=no scroll=no /><title>"&Title&"</title><body bgcolor=MENU></body>'""")
oExec.StdIn.Write Text
oExec.StdIn.Close
Set ModelessMsgBoxWithoutButton=oExec
End Function
――――――――――――――――――――――――――――――――――――――
》 ばんのしゃーによかばんた さん 2005年 08月 11日 15時 04分 13秒
> 第一に着眼点。
> ずっとずっと昔から、こういうのが、ほしくって、作りたかったのですが、
> 作り方が分からず、挫折していたのです。
そうそう。面倒なんですよね。別プロセスのLVITEM操作って……。
NT系と9X系との、OSの違いも吸収しないといけませんし。
http://www.bcap.co.jp/hanafusa/vbbbs/wforum.cgi?mode=allread&no=2449&page=0
> これでやっとWISWIGになりますね。今まではWISbutWInotGでしたから。
WISWIG……という言葉は初めて聞きました。「WYSIWYG」とは別物?
>ところで、ListViewなどWin95で追加されたものは、それ以前のListBoxなど
ListViewを先にサポートしたのは、NT3.51 だったような気も……うろ覚えですが。
>と違って、空間間で単にメッセージを飛ばすだけでは使えなくなりました。
そもそもは Win32 で、プロセスごとにメモリ空間を独立させたのが原因ですよね。
http://techtips.belution.com/ja/vc/0001/
http://homepage2.nifty.com/Mr_XRAY/Halbow/Notes/N012.html
それ自体は、OSの安定性という点から見れば、大きな意義のある事ですが、
その分、プロセス間でメモリの読み書き(ポインタ操作)を行う場合の
手間が増えてしまった……と。(自プロセス上の場合は、そうした手間は無し)
> よく知らない人が変に作ってしまったのではないか、と疑っているのですが、
> どうなんでしょう。
「変」と思うかどうかは個人の主観によるものなので、あえて触れずにおくとして。
(EM_GETTEXT などの)昔からのメッセージが、ポインタに対する操作であるにも
関わらず、プロセス間で読み書きできる点については、それらがWin16との互換性を
意識して、例外的に「特別扱い」した結果なのだと思います。
で、それらはあくまで特例だったので、新しく追加された LVM_GETITEM 等に
ついては、通常どおり、共有メモリ経由でなければ読み書きできない事に
したのだろう……と想像してみたり。
――って、Scriptingな掲示板で話すネタでは無いかな。
To ばんのしゃーによかばんた さん 2005年 08月 11日 21時 03分 10秒
>> それから、Timer関数で返すCountですが、CPUが忙しく動いているときの
>> 時間はCountされていません・・・
>
> どういう現象なんでしょう?
>
> t1=timer
> 何かの処理
> t2=timer
>
> 通常 t2-t1=200 なものが、CPUが忙しく動いていると、t2-t1=400 とかに
> なりそうなものなのに、逆に t2-t1=100 とかになるということでしょうか?
すみません。WSHでは確認できていません。
VBAなら再現します。
<再現方法>
VBAのVBEで適当な計測Programを走らせて、
動作中にMouse Cursorを激しく動作させる。
<結果>
通常に比べて3割ほど低い計測値が得られる。
これはVBAのBugでしょうか?
しかし、OS起動時間から値を返す仕様が本当であれば、
何かがありそうな気がしますが・・・
>うに さん 2005年 08月 03日 09時 32分 53秒
>Set objShell = WScript.CreateObject("WScript.Shell")
>Set objExec = objShell.Exec("java Hello")
>strLine = objExec.StdOut.ReadLine
>Wscript.Echo strLine
>とりあえず試しにこんな感じでうまくいきました。
ちょっと疑問が湧きました。
上のケースで、とりあえずでなく、ちゃんと使おうとしたとき、
親プロセスが終了したら、子プロセスはどうなるか?
逆に、親プロセスが終了しなかったら、子プロセスはどうなるか?
で、下記のテストプロを作って試してみました。
Test.VBS
――――――――――――――――――――――――――――――――――――――
Set wShell=CreateObject("WScript.Shell")
Set oExec=wShell.Exec("CScript.EXE OutLine.VBS")
MsgBox oExec.StdOut.ReadLine()
WScript.Quit
――――――――――――――――――――――――――――――――――――――
OutLine.VBS
――――――――――――――――――――――――――――――――――――――
Option Explicit
Dim OnScriptTerminate
Class ScriptTerminate
Sub Class_Terminate()
MsgBox "エラーコード: "&Err.Number&" &H"& Hex(Err.Number)
End Sub
End Class
Set OnScriptTerminate=new ScriptTerminate
Dim fso
Dim wShell
Dim k
Set fso=CreateObject("Scripting.FileSystemObject")
Set wShell=CreateObject("WScript.Shell")
For k=1 To 10
WScript.StdOut.WriteLine String(1000,"a")
' MsgBox k
Next
――――――――――――――――――――――――――――――――――――――
親が終了しないと、
子は、1行の後に4097byte以上を書き込んだところでブロックされます。
親が終了すると、
タイミングや、1行の後に4097byte以上を書き込んだところで、
WScript.StdOut.Writeが
エラーコード: -2147024664 &H800700E8 パイプを閉じています。
で終わるようです。
しかも、CScript.EXEがそのエラーメッセージを書こうとしても、
StdErrも閉じているので、音無しで終わるようです。
なので、Execの場合は、ReadAllを使うか、EOFになるまでしっかり
読み切ったほうがよいでしょう。
※以前は、164byte以上だったのに、あまりに小さいので変えたのかな。
>ばんのしゃーによかばんた さん 2004年 05月 02日 19時 28分 47秒
※なんかチェックされているような。
付箋紙 (補足)甲案はHTAです。
乙案.HTA BORDERあり。
――――――――――――――――――――――――――――――――――――――
<html>
<head>
<script>
moveTo(0,0);
resizeTo(200,75);
function dblclick(){
if(event.shiftKey){
var path1=location.pathname.replace(/%20/g,' ')
var path2=prompt("保存先ファイル名を入れてください。",path1);
if(!path2)return;
var fso=new ActiveXObject("Scripting.FileSystemObject");
if(fso.FileExists(path2) && !confirm(path2+'\n既存のファイルに上書きしますか?'))return;
var HTML=document.documentElement.outerHTML;
HTML=HTML.replace(/moveTo\(\-?\d+,\-?\d+\);/,'moveTo('+(event.screenX-event.x-4)+','+(event.screenY-event.y-23)+');');
HTML=HTML.replace(/resizeTo\(\d+,\d+\);/,'resizeTo('+(document.body.offsetWidth+8)+','+(document.body.offsetHeight+27)+');');
fso.CreateTextFile(path2).Write(HTML);
if(path1!=path2){
new ActiveXObject("WScript.Shell").Run('"'+path2+'"');
close();
}
}else{
if(document.body.contentEditable=="true")document.body.contentEditable="false";
else document.body.contentEditable="true";
}
}
</script>
<hta:application minimizebutton=no maximizebutton=no showintaskbar=no scroll=no />
<title>Note Bar</title>
</head>
<body bgcolor=yellow ondblclick=dblclick() contentEditable="true">
メッセージ
</body>
</html>
――――――――――――――――――――――――――――――――――――――
「ダブルクリック」編集モードと表示モードを切り替えます。
「Shift+ダブルクリック」保存します。
その他はBORDERにお任せ。
丙案.VBS InputBoxで代用。
――――――――――――――――――――――――――――――――――――――
Set wShell=CreateObject("WScript.Shell")
Do
Text=InputBox("メモ",WScript.ScriptName,Text,0,0)
If Text="" Then Exit Do
If IsNull(PutClipByMsForms(Text)) Then Call PutClipByMsIE(Text)
' wShell.SendKeys "%{tab}"
' WScript.Sleep 100
' wShell.SendKeys "^v"
Loop
WScript.Quit
Function PutClipByMsIE(Text)
Const OLECMDID_COPY = 12
Const OLECMDID_SELECTALL = 17 '(&H11)
Const OLECMDEXECOPT_DODEFAULT = 0
Dim ie
Set ie=CreateObject("InternetExplorer.Application")
'ie.Visible=true
ie.Navigate "about:blank"
Do While ie.Busy Or ie.ReadyState<>4
WScript.Sleep 100
Loop
ie.Document.Body.InnerText=Text
ie.ExecWB OLECMDID_SELECTALL,OLECMDEXECOPT_DODEFAULT
ie.ExecWB OLECMDID_COPY,OLECMDEXECOPT_DODEFAULT
ie.Quit
Set ie=Nothing
End Function
Function PutClipByMsForms(Text)
Dim uf
Dim tb
On Error Resume Next
Set uf=CreateObject("Forms.Form.1")
On Error GoTo 0
If IsEmpty(uf) Then
PutClipByMsForms=Null
Exit Function
End If
Set tb=uf.Controls.Add("Forms.TextBox.1").Object
tb.MultiLine=True
tb.Text=Text
tb.SelStart=0
tb.SelLength=tb.TextLength
tb.Copy
Set tb=Nothing
Set uf=Nothing
End Function
――――――――――――――――――――――――――――――――――――――
OK - クリップボードにコピー。
Cancel - 終了。
>ちゃっぴ さん 2005年 08月 10日 12時 09分 44秒
>それから、Timer関数で返すCountですが、CPUが忙しく動いているときの
>時間はCountされていません・・・
どういう現象なんでしょう?
t1=timer
何かの処理
t2=timer
通常 t2-t1=200 なものが、CPUが忙しく動いていると、t2-t1=400 とかに
なりそうなものなのに、逆に t2-t1=100 とかになるということでしょうか?
> こんなときにこそスクリプトを使うべきだと思うんですよ。
御意。確かに・・・。すっかり頭に血が上って忘れてました。
参考になりました。ありがとうございました。
>
> Set Fs=CreateObject("Scripting.FileSystemObject")
> Set ts=Fs.CreateTextFile("test2.vbs")
> For I=1 To 5240
> ts.write String(98,"'") & vbCrLf
> Next
> ts.Write String(288,"'")
> ts.CLose
> msgbox "done"
To: うに さん
> WScript.Execを使おうと思っていたのですが、
> 出力がエラーの場合には取得できないのでしょうか??
WshScriptExecオブジェクトのStdOutプロパティではなく
StdErrプロパティを使ってください。
To: Nomu さん
> WSHで、Scriptletなどの外部コンポーネント化をせず、
> 1つのファイルで作成するとき、皆様の中で1ファイルの
> バイトサイズは最高どのくらいまで作成されたことが
> ありますか?(コメント行なども含んで)
こんなときにこそスクリプトを使うべきだと思うんですよ。
Set Fs=CreateObject("Scripting.FileSystemObject")
Set ts=Fs.CreateTextFile("test2.vbs")
For I=1 To 5240
ts.write String(98,"'") & vbCrLf
Next
ts.Write String(288,"'")
ts.CLose
msgbox "done"
例えばこれで512KBのvbsファイルができるので、あとはテキストエディタで
MsgBox "実行できたよ〜"
とでも付け加えて、実際に動かしてみましょう。
私の環境(WinXP Pro, Athlon 64 3000+, 1GB RAM)では、100MBの
VBSファイルでも時間はかかるものの実行できました。
WSCファイルみたいな上限はないものと考えていいんじゃないでしょうか。
魔界の仮面弁士様
> 過去の業務経験からいえば、*.WSCファイルについては、
> 512KB(つまり、524,288バイト)が上限のようです。
> ファイルサイズが、これを1バイトでも超えると実行できなくなります。
>
> *.VBSファイル、*.JSファイル、*.HTAファイル等については未調査です。
貴重な情報ありがとうございます。私の作成はVBSファイルですが、
まだ大丈夫なような感じで勇気?づけられました。
ファイル内に相当コメント行もありますので、いざとなれば
それを抜いてスリム化は可能ですが、、、、
また、他の方も上限サイズに関する情報がありましたら、
教えてください。よろしくお願いします
また躓いてしまいました。
標準出力取得で困っています。
WScript.Execを使おうと思っていたのですが、
出力がエラーの場合には取得できないのでしょうか??
Function out(com)
Set objShell = WScript.CreateObject("WScript.Shell")
Set objExec = objShell.Exec(com)
Do Until objExec.StdOut.AtEndOfStream
out = out + objExec.StdOut.ReadLine & vbNewLine
loop
End Function
str = out("java abc.java")
WScript.Echo(str)
の用にしたのですが、コマンドプロンプトで例えばabc.javaが存在しない場合通常は、
Exception in thread "main" java.lang.NoClassDefFoundError: abc/java
の用にでるはずなのですが、なにも出力されません。
abc.javaが存在する場合には出力されています。
java以外でも、エラーとなるコマンドを実行した場合には無視されてしまうようです。
エラーでも出力を取得するようなオプションはないのでしょうか?
》Nomu さん 2005年 08月 11日 15時 12分 54秒
> 1つのファイルで作成するとき、皆様の中で1ファイルの
> バイトサイズは最高どのくらいまで作成されたことが
> ありますか?(コメント行なども含んで)
過去の業務経験からいえば、*.WSCファイルについては、
512KB(つまり、524,288バイト)が上限のようです。
ファイルサイズが、これを1バイトでも超えると実行できなくなります。
*.VBSファイル、*.JSファイル、*.HTAファイル等については未調査です。
WSHで、Scriptletなどの外部コンポーネント化をせず、
1つのファイルで作成するとき、皆様の中で1ファイルの
バイトサイズは最高どのくらいまで作成されたことが
ありますか?(コメント行なども含んで)
今、作成中のWSH(VBS)が作成半ばで50KBくらいまでになり、
いざ完成した頃、ファイルサイズオーバーで実行できません
みたいなエラーがでないか不安になってきました。
付箋紙を作ってみました。
甲案
――――――――――――――――――――――――――――――――――――――
<html>
<head>
<meta http-equiv=Content-Type content="text/html; charset=shift_jis">
<script>
moveTo(0,0);
resizeTo(200,45);
var originX,originY;
var fMOVE=false;
var fSIZE=false;
var fMENU=false;
function mousedown(){
if(event.button==2){
if(event.ctrlKey){
fSIZE=true;
originX=event.screenX;
originY=event.screenY;
document.body.style.cursor="nw-resize";
}else{
fMOVE=true;
originX=event.screenX;
originY=event.screenY;
document.body.style.cursor="move";
}
}
}
function mouseup(){
if(fMOVE||fSIZE){
fMOVE=false;
fSIZE=false;
document.body.style.cursor="default";
}
}
function contextmenu(){
if(fMENU){
fMENU=false;
event.returnValue=false;
}else{
event.returnValue=true;
}
}
function mousemove(){
if(fMOVE){
moveBy(event.screenX-originX,event.screenY-originY);
originX=event.screenX;
originY=event.screenY;
fMENU=true;
}
if(fSIZE){
resizeBy(event.screenX-originX,event.screenY-originY);
originX=event.screenX;
originY=event.screenY;
fMENU=true;
}
}
function dblclick(){
if(event.shiftKey){
var path1=location.pathname.replace(/%20/g,' ')
var path2=prompt("保存先ファイル名を入れてください。",path1);
if(!path2)return;
var fso=new ActiveXObject("Scripting.FileSystemObject");
if(fso.FileExists(path2) && !confirm(path2+'\n既存のファイルに上書きしますか?'))return;
var HTML=document.documentElement.outerHTML;
HTML=HTML.replace(/moveTo\(\-?\d+,\-?\d+\);/,'moveTo('+(event.screenX-event.x)+','+(event.screenY-event.y)+');');
HTML=HTML.replace(/resizeTo\(\d+,\d+\);/,'resizeTo('+(document.body.offsetWidth)+','+(document.body.offsetHeight)+');');
fso.CreateTextFile(path2).Write(HTML);
if(path1!=path2){
new ActiveXObject("WScript.Shell").Run('"'+path2+'"');
close();
}
}else if(event.ctrlKey){
if(confirm("閉じますか?"))close();
}else{
if(document.body.contentEditable=="true")document.body.contentEditable="false";
else document.body.contentEditable="true";
}
}
</script>
<hta:application border=none innerborder=no showintaskbar=no scroll=no />
<title>Note it</title>
</head>
<body bgcolor=yellow onmousedown=mousedown() onmouseup=mouseup() onmousemove=mousemove()
oncontextmenu=contextmenu() ondblclick=dblclick() contentEditable="true">
メッセージ
</body>
</html>
――――――――――――――――――――――――――――――――――――――
「ダブルクリック」編集モードと表示モードを切り替えます。
「CTRL+ダブルクリック」終了します。ALT+F4でも終了します。
「Shift+ダブルクリック」保存します。
「右ボタンドラッグ」位置を移動します。
「CTRL+右ボタンドラッグ」サイズを変更します。
これは、すばらしいです。
矢吹拓也さん作
|リストビューをCSV化「ListView to CSV」v1.52.06
|エクスプローラの“詳細表示”やタスクマネージャなどから文字列を取り出す
|http://www.yoshibaworks.com/ayacy/inasoft/
第一に着眼点。
ずっとずっと昔から、こういうのが、ほしくって、作りたかったのですが、
作り方が分からず、挫折していたのです。
これでやっとWISWIGになりますね。今まではWISbutWInotGでしたから。
第二にサンプルソースと作り方まで公開していること。
恩知らずにも、強欲を言うと、スクリプトからCOMで使えるようにしてほしい。
Cソースサンプルがあるから、それを参考にCOMコンポーネントが作れるかも。
誰か作ってー。
第三に使用許諾条件。
「このソフトウェアは、ユーザーが自称初心者(=初心者であることを威張り、
他の人より多くの利益を得ようとする者)である場合は利用できません。」
ところで、ListViewなどWin95で追加されたものは、それ以前のListBoxなど
と違って、空間間で単にメッセージを飛ばすだけでは使えなくなりました。
これって、なんか技術文化の断絶のような違和感を感じます。
Win95でNTより先行して作ったために、NTのひとが見てないところで、
よく知らない人が変に作ってしまったのではないか、と疑っているのですが、
どうなんでしょう。アプリ用のメッセージIDを割り当てたりして、仮に作って、
システムがマーシャルする正式のメッセージIDに割り当て直すのを忘れて、
製品化してしまった、とか。
>魔界の仮面弁士 さん 2005年 08月 10日 10時 32分 37秒
>》ニモ さん 2005年 08月 10日 00時 20分 49秒
>> 秒以下の時間を取得する方法はあるのでしょうか?
>VBScriptのTimer関数は、「午前0時からの経過秒数」を
>小数点以下も含めて返しますので、下記のようにして
>求める事はできます。正確な値ではありませんけど。
>D = Timer - ((Hour(Time) * 60 + Minute(Time)) * 60 + Second(Time))
ちょっと重要なポイントなので、突っ込みます。
>D = Timer※1 - ((Hour(Time※2) * 60 + Minute(Time※3)) * 60 + Second(Time※4))
異なる4つの時刻を分解合成しても、全く何の意味もない値になります。
この手のバグはテストでは見つけられないので、
人の目で、最初に徹底的に潰さないといけません。
上のソースを見て、これに、ぱっと気付いた人は業務システムを作ってよし。
今、気付いた人は、自分の弱点として肝に銘ずるべし。
まだ、分からない人は、業務システムに手を出すべからず。
で、正しい答えは、
もし、時間の計測に使うのなら、Timerを使う。
時刻の場合は、秒より下は不要。見た目なら、.000みたいに適当に補えばよい。
それが、ずれていると言える人はいないでしょう。
もし、秒より下が必要な場合、必要としている論理のほうに誤りがある。
と考えたほうがよいでしょう。方向性が間違っている。
例えば、タイムスタンプで一意に識別できると思っている、とか。
昔、東証だったか、社会システムで、2つの電文(処理要求メッセージ)が
たまたま衝突したとき、どっちを先に処理するかをタイムスタンプで比較してた。
そのタイムスタンプがたまたま同じだったときのルートを全くの初めて通った。
でも、そのルートは作ってなかった。市場システムがダウンした、みたいな。
そもそもタイムスタンプを使う必然性がなく、必要のないものを見てこける、
という泣くに泣けない話だったような。
# MSH(Monad Shell; Microsoft Shell)にハマり中。
# 詳細はまた。
To: ニモ さん
コマンドプロンプトで
cscript //H:WScript
と入力してみてください。
これで既定の(スクリプトファイルをダブルクリックしたときの)
動作がwscript.exeになり、コンソールが表示されなくなります。
元に戻したいときは//H:CScript ですね。
魔界の仮面弁士さま
たびたびの回答ありがとうございます。
今回はWBSで対応するため、魔界の仮面弁士が提案してくれた
秒以下の単位を算出する方法にします!
あの・・・これはあまりに基本的かもしれないのですが。。。
VBスクリプトをダブルクリックで実行するとコンソールのような
ものが表示されてしまいます。
表示されないようにすることはできるのでしょうか?
違う環境のPCでダブルクリックで実行するとでないのですが。。。
すいませんがよろしくお願いします。
>YZN様
ありがとうございます!!!早速試してみました!
おかげさまで、いろいろなことがわかりました。
これで結構材料が集まってきましたので、
こつこつ書いていこうと思います。
また壁に当たったら、よろしくお願いします。
>うに さん (null) 2005年 08月 10日 15時 04分 29秒
通常は、vbCrLfかvbNewLineを使います。
例)
With CreateObject("Scripting.FileSystemObject").CreateTextFile("C:\aaa.log")
Call .WriteLine("1行目")
Call .Write("2行目")
Call .Write("のつづき" & vbCrLf)
Call .Write("3行目" & vbCrLf & "4行目")
Call .WriteLine( vbNewLine & "通常は、WriteLineだね")
Call .Close
End With
お世話になっています。
ログファイルに逐次書き込んでいくスクリプトを書いているのですが、
改行が入らないので、
一つ書き込んだ後に改行を入れようと
+"\n"
と何の疑いもなくやってみたところ、だめなんですね・・・
そのまま\nと付加されてしまいました。
そこで、WEBでエスケープ文字、VB 改行、改行コード
などと調べてみたのですが、なかなか見つかりませんでした。
改行コードを書き込むにはどうしたら良いのでしょうか・・・
》ニモ さん 2005年 08月 10日 00時 20分 49秒
> 秒以下の時間を取得する方法はあるのでしょうか?
.NETの存在を忘れていました。
System.DateTimeは、秒未満の値をサポートしていますね。
//------ JScript.NET ------
import System;
Console.WriteLine(DateTime.Now.ToString("yyyy MM dd HH mm ss fffffff zz"));
To ニモ さん 2005年 08月 10日 00時 20分 49秒
> 秒以下の時間を取得する方法はあるのでしょうか?
> WMIには、特定の時刻、あるいは時間差を扱うための
> 「SWbemDateTimeクラス」が用意されています。
> (ただしこれ自体には、現在時刻を取得するような機能はありません)
時刻を取得されるClassとしては、
「Win32_LocalTime」,「Win32_UTCTime」
なんかがありますが、肝心の Milliseconds Property が
「Not used.」つまり、使えないんですよね。
それから、Timer関数で返すCountですが、CPUが忙しく動いているときの
時間はCountされていません・・・
VBAにて GetTickCount, TimeGetTime でも同様の現象を確認しました。
>魔界の仮面弁士 様
何度も何度もありがとうございました。
なにも分からず闇雲にコーディングしていました。
教えていただいた手順でやっと一行一行がなにを意味しているかわかりました。
そして、文字も化けずに表示できました!
うれしいです!これでまた作業が進みそうです!
おそらくまたわからないところがでてきてしまうと思います・・・
またよろしくお願いいたします。
■問題■
漢字を含んだネットワークフォルダに対して、
GetFolderメソッドでFolderオブジェクトを取得し、
Pathプロパティで見ると、文字化けが起こっています。
■例■
With CreateObject("Scripting.FileSystemObject")
Msgbox .GetFolder("\\PCServer\共用\wil").Path '(1)
Msgbox .GetFolder("\\MyPC\共有\AAA").Path '(2)
Msgbox .GetFolder("\\MyPC\共有\AAA\共有").Path '(3)
Msgbox .GetFolder("\\MyPC\Share\AAA").Path '(4)
Msgbox .GetFolder("C:\共有\AAA").Path '(5)
End With
■結果■
(1)\\PCServer\q(\wil
(2)\\MyPC\q(→)\AAA (→)はTAB
(3)\\MyPC\q(→)\AAA\共有 (→)はTAB
(4)\\MyPC\share\AAA
(5)C:\共有\AAA
※問題が発生する端末と発生しない端末があるとかないとか・・・。
■環境■
OS:WindowsXP(SP1)
Office:2000Pro(SP3)
scrrun.dll:5.6.0.8825
■調べたこと■
Googleで調べましたが、
http://64.233.179.104/search?q=cache:-LS5JbiZcbcJ:www.bcap.co.jp/hanafusa/vbbbs/wforum.cgi%3Fmode%3Dallread%26no%3D740%26page%3D0+GetFolder+%E5%8C%96%E3%81%91&hl=ja&lr=lang_ja%20target=nw
に事例があるだけで、他には見当たりませんでした。
英語圏で調べようにも2バイトコードの話だと思うので、調べようがありません。
(「化け」がどういう単語かわからないし(笑))
既に、私のほうでは、問題は解決しているので、
単に興味レベルな質問なのですが、
FSOやWSH使いの間では、有名な事例なのでしょうか?
# そもそも、共有フォルダ名に漢字を使うなというのは重々承知してます。(汗
》うに さん (null) 2005年 08月 10日 09時 49分 46秒
> たびたびすみません。以下のように書き直してみたのですが・・・
あら。「adTypeBinary」の記述は何処にいってしまったのでしょう? (^^;
Typeプロパティは、「バイナリの読み書きモード」と
「テキストの読み書きモード」を切り替えるための物です。
今回は、adTypeBinary も adTypeText も、両方必要になりますよ。
> Const adTypeText =1
先の投稿で、私は「Const adTypeText = 2」と回答したかと思います。
= 1 にしてしまうと、adTypeBinary の意味になってしまいますよ。
Stream.Charsetの行でエラーとなってしまったのは、そのせいでしょう。
(Charsetプロパティは、バイナリモードでは使用できませんからね)
> Adodbがちがうのでしょうか・・・
ではなく、手順の問題でしょうね。
言葉で書くと……ストリームをバイナリモードにしておき、そこに、
Webサーバから得たバイナリデータ(oHttp.responseBody)をストリームに書き込む。
その後、ストリームをテキストモードに変更してから、文字コードを指定して
それを文字列として読み込む……という流れになります。
処理の流れでいえば、次のようになります。
1. StreamのTypeプロパティをadTypeBinaryにする。
2. StreamのOpenメソッドを呼び出す。(1.と2.は逆でも可)
3. StreamのWriteメソッドで、oHttp.responseBody をストリームに書き込む。
4. StreamのPositionプロパティを0に戻して、ストリームの先頭に戻る。
5. StreamのTypeプロパティをadTypeTextにする。
6. StreamのCharsetプロパティにて、文字コードを指定する。
7. StreamのReadTextメソッドで、文字列を読み取る。
この順番で処理すれば、エラーは出ないと思います。試してみてください。
》ニモ さん 2005年 08月 10日 00時 20分 49秒
> 秒以下の時間を取得する方法はあるのでしょうか?
VBScriptのTimer関数は、「午前0時からの経過秒数」を
小数点以下も含めて返しますので、下記のようにして
求める事はできます。正確な値ではありませんけど。
D = Timer - ((Hour(Time) * 60 + Minute(Time)) * 60 + Second(Time))
# NEC PC-9800系PCを使っている場合、Win95では、
# 一部の機種で、Timer関数が整数を返す事があります。
> DateとTimeを利用すれば20050809221030までは取得できる
VBScriptの日付型では、秒未満の値はサポートされません。
そのため、Now関数やTime関数からの取得はできません。
> 20050809221030567
> ~~~
> ↑
> ココです。
WMIには、特定の時刻、あるいは時間差を扱うための
「SWbemDateTimeクラス」が用意されています。
(ただしこれ自体には、現在時刻を取得するような機能はありません)
strDate = "20050809221030.567890+540"
Set dateTime = CreateObject("WbemScripting.SWbemDateTime")
dateTime.Value = strDate
MsgBox _
"UTC=" & CStr(dateTime.UTC) & vbCrLf & _
"年=" & CStr(dateTime.Year) & vbCrLf & _
"月=" & CStr(dateTime.Month) & vbCrLf & _
"日=" & CStr(dateTime.Day) & vbCrLf & _
"時=" & CStr(dateTime.Hours) & vbCrLf & _
"分=" & CStr(dateTime.Minutes) & vbCrLf & _
"秒=" & CStr(dateTime.Seconds) & vbCrLf & _
"ミリ秒=" & CStr(dateTime.Microseconds)
>魔界の仮面弁士様
たびたびすみません。以下のように書き直してみたのですが・・・
Const adTypeText =1
Set oHttp = CreateObject("MSXML2.XMLHTTP")
oHttp.Open "GET","http://localhost",False
oHttp.Send
Set Stream = WScript.CreateObject("Adodb.Stream")
Stream.Type=adTypeText
Stream.Open
Stream.Write oHttp.responseBody
Stream.Position = 0
Stream.Charset="Shift_JIS"
S=Stream.ReadText()
MsgBox S
Stream.Charsetの行でエラーとなってしまいます。
このコンテキストで操作は許可されていません。
ADODB.Stream
Adodbがちがうのでしょうか・・・
》うに さん (null) 2005年 08月 10日 09時 11分 03秒
> たびたびすみません。6行目でエラーとなります。
> 引数が間違った型、許容範囲外、または競合しています。
VBScriptでは、先頭に「Option Explicit」を宣言していない場合、
未定義の変数や定数が、空の値(Empty値)として取り扱われる事になります。
そのため、6行目の『Stream.Type=adTypeBinary』というコードが、
『Stream.Type = Empty』として処理され、引数エラーとなったのでしょう。
最初にYZNさんが紹介くださったURLを、再々度確認してみてください。
「adTypeBinary」という定数(Const)を定義している部分が
あるはずですので、それも記述してあげればOKでしょう。
>魔界の仮面弁士 様
Set oHttp = CreateObject("MSXML2.XMLHTTP")
oHttp.Open "GET","http://localhost",False
oHttp.Send
Set Stream = WScript.CreateObject("Adodb.Stream")
Stream.Type=adTypeBinary
Stream.Open
Const adTypeText = 2
Stream.Write oHttp.responseBody
Stream.Position = 0
Stream.Charset="Shift_JIS"
S=Stream.ReadText()
MsgBox S
たびたびすみません。6行目でエラーとなります。
引数が間違った型、許容範囲外、または競合しています。
ADODB.Stream
だそうです・・・よろしくお願いいたします。
魔界の仮面弁士さま
レスありがとうございました!!!
無事にnullチェックができるようになりました。
感謝です。
みなさま
うにさんのお話にちょっとだけのっかかった話なの
ですが、秒以下の時間を取得する方法はあるのでしょうか?
20050809221030567
~~~
↑
ココです。
DateとTimeを利用すれば20050809221030までは取得できる
のですが。調べてみたのですがそれ以降の時間を取ることは
どこにも書いてありませんでした。
もしなにか方法がありましたら教えてくれませんでしょうか?
よろしくお願いします。