UWSC 掲 示 板
投稿時に「証明書が不正です」と出る場合には、JavaScriptをオンにしてください
動作不具合での質問の場合には環境(OS,IEのバージョン等)の表記もしてください
タイトルは質問内容を表したものにしてください
ネットゲーム関係の質問はご遠慮ください

FOPENでメモファイルを64回以上開きたい / skyblue
 いつも大変お世話になっています。

 FOPEN関数を使って、メモ帳(1行の記録データを変化させている)を繰り返し開きますが、開く回数が64回を超えるとエラーとなり中止になります。

 何か良い方法が有ればご指導ください。

a=FOPEN(パス,F_READ or F_WRITE)
b=FGET(a, 1)

No.4284 2017/08/02(Wed) 18:51:50

Re: FOPENでメモファイルを64回以上開きたい / satocha
fopenしたあときちんとfcloseしてますか。
開きっぱなしで扱える数には上限が有りますので。

No.4285 2017/08/03(Thu) 01:11:26

Re: FOPENでメモファイルを64回以上開きたい / skyblue
satocha さん 有難う御座います。

 早々とご指導頂き感謝しています。

 nothing とか close 等が有るかと、ネットで fopen の例題を見負た時には見つける事が出来ませんでした。
また、デスクトップ上には目的のファイルが1枚も開いていなかったので、気になりませんでした。

 早速、実際のソフトで試して、後程報告します。

No.4287 2017/08/03(Thu) 09:34:33

Re: FOPENでメモファイルを64回以上開きたい / skyblue
satocha さん 

 お陰様で解決しました。
実際に走らせて問題無く64回を超えました。
ご指導、有難う御座いました。

No.4288 2017/08/03(Thu) 11:06:39
Google Chromeでの操作について / JIN
Chromeでの操作でつまづいております。(※IEでの操作は考えておりません。)
下記の2つについてお分かりの方、ご教授いただければと思います。

・公式のサンプル(#N37)がきちんと動きません。

  →実行すると動作が途中で止まってしまいます。正しいソースを教えていただけないでしょうか?


・ChromeでのTABの操作について

  →こちらは下記のような形以外にもう少しスマートなやり方はありますでしょうか?

  @リンクをShift+クリック(新しいタブが開く)
  ACtrl+TABボタンで移動(タブの移動)
  BGETIDで目的のものが表示されているか確認

どうぞよろしくお願いいたします。

No.4281 2017/07/29(Sat) 10:16:58

Re: Google Chromeでの操作について / satocha
ページ内の要素にアクセスできないので、本格的にやろうとするとブラウザ自動テストツールの
seleniumを使うくらいでしょうか。

www.google.co.jp/search?q=selenium+chrome

結構大変なので手軽にやるならアドレスBOXにjavascriptを投入してdom経由で操作するぐらいです。下はこの方法で掲示板を開き、chromeを検索する例です。

id=exec( "c:\Chrome.exeのパス http://www.uwsc.info" )
id =getChromeId( "UWSC" )
SenddToAdrBox(id, "http://www3.rocketbbs.com/13/bbs.cgi?id=umiumi&mode=find")
js ="document.getElementsByName('word')[0].value='chrome';"
js =js+"document.getElementsByClassName('btn')[0].click();"
SenddToAdrBox(id, "javascript:"+js)

function getChromeId( title )
 result=getid(title + " - Google Chrome","Chrome_WidgetWin_1",-1)
fend
procedure SenddToAdrBox(id,str)
 sendstr(id,str,1,TRUE,TRUE)
 ctrlwin(id,Activate)
 kbd(vk_alt,down)
 kbd(vk_d)
 kbd(vk_alt,up)
 kbd(vk_return)
 sleep(1.5)
fend

No.4282 2017/07/30(Sun) 02:53:10
画像のドラッグアンドドロップについて / JIN
登録した画像の位置(FROM)から(TO)へ動かしたいのですが、うまくいきませんでした。
WEB側ではAJAXでドラッグアンドドロップを感知し、画像の入れかえをしているのですが、ドラッグはできても、ドロップができません。
ドロップするすんぜんに手でマウスを動かすときちんとドロップできているので、何かが抜けているのだと思うのですが、どうぞよろしくお願いいたします。


dx=(TO_X - FROM_X) / 20
dy=(TO_Y - FROM_Y) / 20

BTN(LEFT,DOWN,FROM_X,FROM_Y,300)
SLEEP(0.05)
FOR n=1 TO 20
x=x+dx
y=y+dy
MMV(x,y)
sleep(0.015)
NEXT
BTN(LEFT,UP,TO_X, TO_Y,300)

No.4267 2017/07/26(Wed) 14:48:52

Re: 画像のドラッグアンドドロップについて / JIN
>ドロップするすんぜんに手でマウスを動かすときちんとドロップできているので

と記載しましたが、正しくは、下記となります。

「上記プログラムでマウスが移動している際に」ドロップする寸前に手でマウスを動かすときちんとドロップできているので

どうぞよろしくお願いいたします。

No.4268 2017/07/26(Wed) 16:11:25

Re: 画像のドラッグアンドドロップについて / koi
想像で描いてます
OSがどのような形でドラッグアンドドロップと判定するのか判りませんが
ボタンダウン・マウス移動・ボタンアップ をセットで認識していた場合
MMVの時間が短かったりすると移動の検知が
できていない可能性はあるのではないかと思います
(そこを手で動かすと認識する  と言った事なら尚更そんな気がします)

移動のSLEEP時間を伸ばしたりしたら動いたりしませんか?

No.4269 2017/07/26(Wed) 17:00:22

Re: 画像のドラッグアンドドロップについて / JIN
KOIさん、ご連絡ありがとうございます。
MMV(x,y,100)とやってみましたが、やはりだめでした。

動作が遅いことによって分かったことがあります。

プログラムでは、画像が引っ張っていない状態になっていました。
(通常の画像を手作業でドラッグアンドドロップすると画像がマウスの動きについてくると思うのですが、それができていませんでした。)

マウスを手で動かすだけで(クリックしなくても)画像を掴むようで、その後はドロップまできちんと動いてくれました。

引き続き、どうぞよろしくお願いいたします。

No.4270 2017/07/26(Wed) 17:36:34

Re: 画像のドラッグアンドドロップについて / koi
擬似的にデスクトップのアイコンを
別の場所にドラッグアンドドロップする処理を行ってみました
スクリプトは以下
BTN(LEFT,DOWN,54,726)
SLEEP(1)
BTN(LEFT,UP,53,886)
SLEEP(5)
BTN(LEFT,DOWN,54,926)
SLEEP(1)
BTN(LEFT,UP,55,726)

BTN DOWN 処理後のSLEEPが短い(無い)と
動かないといった現象が確認できました

MOVEでのSLEEPではなくBTN DOWNの後の時間を(も)
延ばしたらどうなりますか?

No.4272 2017/07/27(Thu) 12:07:28

Re: 画像のドラッグアンドドロップについて / JIN
KOIさん、ありがとうございます。
やってみたのですが、やはりだめでした。

またUWSCの記録ボタンで低レベル記録(マウス移動を記録)して画像をドラッグアンドドロップしたのですが、画像がついてきませんでした。

理解できないのが手動でマウスを動かせばきちんと動くのに、UWSCだと動かないという点です。
UWSCは「マウスとキーボード入力を記録して再生する事ができます。」ということが売りだと思うのですが…

No.4273 2017/07/27(Thu) 17:02:43

Re: 画像のドラッグアンドドロップについて / stuncloud
dropfile() はどうかしら、ファイルを指定したウィンドウにドロップするための関数です
ブラウザだとだめですかね

dropfile()の使い方はヘルプを見てください

No.4274 2017/07/27(Thu) 17:28:22

Re: 画像のドラッグアンドドロップについて / JIN
stuncloudさん、ご連絡ありがとうございます。
入力画面で一度、ファイルをアップロードしてから、移動する必要があるためdropfile()では難しいです。
IEだと記録機能を使ってもドラッグができなかったのですが、Chromeでは記録ができたのでChromeでもう一度チャレンジしたいと思います。
みなさん、ありがとうございました!

No.4277 2017/07/28(Fri) 11:48:10

Re: 画像のドラッグアンドドロップについて / しき
//ドラッグ&ドロップでアップロード
//dropzone.jsプラグインのデモページ
//http://plugmin.co/plugmin/demo/dropzone-master/full.php
o_IE = GetActiveOleObj("InternetExplorer.Application")

id_IE = hndtoid(o_IE.HWND)
h_server = getctlhnd(id_IE, "Internet Explorer_Server")
id = hndtoid(h_server)

dropfile(id, 400, 400, get_cur_dir, "sample.jpg") //ドロップ位置は適当


//ドロップする位置を計算
//<div id="my-awesome-dropzone" class="dropzone">
eo_div = o_IE.Document.getElementById("my-awesome-dropzone")
eo_div.scrollIntoView() //見えるようにスクロール

o_rect = eo_div.getBoundingClientRect()
i_x = o_rect.left
i_y = o_rect.top
mmv(i_x + status(id, st_x), i_y + status(id, st_y))
msgbox(i_x +" "+ i_y)

dropfile(id, i_x +50, i_y+50, get_cur_dir, "sample.jpg")

No.4280 2017/07/28(Fri) 13:48:38
Excelシートのダブルクリックを高レベル関数で実現したい / matsu
Excelマクロで作られたツールがあります。他者から提供されたものでマクロは保護されていて中が見れません(無理に覗くのも良くないかと覗いてません)。
このツールはシート上の特定列のセルをダブルクリックすると、その行に記載されている情報を元に動作(詳細情報を表示)するようになっています。

このツールを1行ずつダブルクリックして順番に動作させていく処理をUWSCで実現したいと思います。
低レベル関数では実現出来ていますが、Excelの表示設定によって座標の調整が必要なため、他の方法が無いかと考えております。

上記のツール上で、UWSCの高度記録を試してみたところ、アイテム名がセル名、種別がCLK_ACCとなっているCLKITEMが記録されたため、記録された内容を基に試しに以下の様に組んでみましたが、いずれもCLKITEMの戻り値がFalseになります。

-----------------------------------------------
id = GETID("Book1.xlsx - Excel", "XLMAIN", -1)
ACW(id)
ret1=CLKITEM(id, "A3", CLK_LEFTCLK)
ret2=CLKITEM(id, "A3", CLK_DBLCLK)
print "1:" + ret1 + " , 2:" + ret2
-----------------------------------------------
種別はCLK_ACCなども試してみましたが変わりませんでした。

BTN以外での実現方法はありませんでしょうか。
何卒よろしくお願いいたします。

No.4271 2017/07/27(Thu) 09:50:22

Re: Excelシートのダブルクリックを高レベル関数で実現したい / stuncloud
COMでダブルクリック操作ができそうですよ
https://msdn.microsoft.com/ja-jp/library/office/ff194422.aspx

No.4275 2017/07/27(Thu) 17:32:10

Re: Excelシートのダブルクリックを高レベル関数で実現したい / matsu
ありがとうございます。

ちょうど本日それを試してみたのですが、上手く行きませんでした。
(あまりじっくり試せた訳ではないのですが)
下記は試した内容のイメージです。

EXCEL = GETACTIVEOLEOBJ("Excel.Application")
EXCEL.Workbooks("XXX.xls").Worksheets("XXX").Activate
EXCEL.Workbooks("XXX.xls").Worksheets("XXX").Cells(X, X).select
EXCEL.DoubleClick

selectまでは当然上手く動いて、その後ダブルクリックが出来ていないような動作でした。

対象ブックの中でBeforeDoubleClickにコードは仕込まれているでしょうから、
それが影響している可能性もあるかと想像しています。
簡単なブック作って試してみましたが同じでした。
確認するにはBeforeDoubleClickに何がしか仕込んでおかないといけませんし...

No.4276 2017/07/27(Thu) 18:00:01
Accessに関するサンプルを探しております・・・ / Ysum
【質問背景】
UWSCを使ったAccessへの自動操作(ボタン操作・プルダウン選択・フォーム入力・画面からの文字列取得など)について、色々とググってみたのですが、umiumiさん作成(ソースは本掲示板内のもの)の下記サンプル以外はほぼ見つからず、マクロの作成に苦戦しております。。

[uwsファイル]
http://siromasa.html.xdomain.jp/uwsc/u_sample/Com/Access/ActiveAccessOperator.uws
[テスト対象accdb]
http://www.msactry.com/down704/index.htm

上記サンプルを上手に利用しようかとも考えたのですが、uwsファイルを実行しても
"COM_Error:Could not convert variant of type (Null) into type (Dispatch)
48行目:FOR I=0 TO FORM.Controls.Count-1"
となり前に進みません。。。
(処理は、オブジェクト取得⇒"問題を解く"というボタンを1つ押下する、
 というシンプルなものです。
 デバッグしましたが、accessのオブジェクトは取得できているようですが、
 ボタンを押下する、という関数の上記48行目で弾かれているようです)

【質問1点目】
Accessを用いたuwsファイルのサンプル等が存在するサイトをご存知ないでしょうか。

【質問2点目】
上記背景に記載させて頂いているエラーの原因は何が想定されますでしょうか。

【質問3点目】
Excel comオブジェクトを利用したマクロは作成できるのですが、accessはからっきしでして、
やはり諦めて、画像認識等を駆使してマクロを組んだ方が宜しいでしょうか・・・?
(あるいは、あまりサンプルが転がっていないので感じたことなのですが、
 Accessで込み入ったUWSファイルの作成を皆さんなされないのでしょうか?)

No.4263 2017/07/24(Mon) 20:36:53

Re: Accessに関するサンプルを探しております・・・ / stuncloud
> 上記背景に記載させて頂いているエラーの原因は何が想定されますでしょうか。
FORMがNULL、あるいはFORM.ControlsがNULL
だということですね、変数にオブジェクトが入ってないです
(どうしてそうなったかはコードを見てみないことにはわからないですが)

1点目と3点目に関してはAccessのVBAで情報を探したほうが良いと思います
VBAでのApplicationオブジェクトがUWSCで言うGETACTIVEOLEOBJ("Access.Application")したものとほぼ同じです
文法も似てるところがあるのでUWSCのスクリプトが書けるのなら十分読み解けると思いますよ
これはExcelでもWordでもそうなんですが、やはり本家のVBAのほうが情報たくさんありますからね
読み解くのが難しいと感じたならば、少し遠回りになりますがVBAの簡単なサンプルからUWSCへの移植を試みると良いでしょう
そうやって慣れていけばVBAのサンプルを見ただけでUWSCのコードに落とし込めるようになるはずです

個人的にはAccess全く使わないのでUWSCで処理させるってこともないですね
DBを使いたいというケースが過去にありましたがそのときはADODBとか使ってました

No.4264 2017/07/25(Tue) 09:57:27

Re: Accessに関するサンプルを探しております・・・ / Ysum
stuncloudさん、ご返信ありがとうございます。
なるほどAccessのVBAから勉強する(あるいは調べる)というのが確かに王道ですね。
盲点でした。少し勉強してみたいと思います!ありがとうございました!

No.4266 2017/07/26(Wed) 10:48:59
変数を用いてダウンロード、保存するファイル名の記述方法 / VBA-IE
UWSCのホームページのサンプル#58の”IEにてファイルをダウンロード処理”を使い記述していますが、5行目のダウンロードして保存するファイル名(abc.zip)を変数を用いた記述に変更したいのですが、記述方法が分かりません。
具体的には、このファイル名はUWSCを呼び出すVBA上で変数宣言(DLfile)して使用しており、それをそのままUWSCへ引き渡し、変数として記述したいのですが、記述方法など教えてください。

5行目をsetNameFileDlg(DLfile, ".CSV") と記述したら、変数DLFILEが指定されていませんとエラーになります。

// IE にてファイルのダウンロード処理  #N58
// IE(IE9以上) にてダウンロードのページが開いている事(http://www.uwsc.info/download.html)
ieid = GETID("Internet Explorer", "IEFrame")
ClkItem(ieid, "UWSC Free版", CLK_LINK or CLK_SHORT) // Free版のUWSCをクリック
sleep(1) // 間が必要
ClkItem(ieid, "\保存\名前を付けて保存", CLK_BTN) // '保存'スプリットボタンの '名前を付けて保存'をクリック
setNameFileDlg("abc", ".zip") // ファイル名 abc.zip にてダウンロード
closeDlg(ieid) // ダウンロード終了確認

// '名前を付けて保存'ダイアログに名前を設定し保存(fname:保存ファイル名、extens:拡張子)
Function setNameFileDlg(fname, extens)
Result = False
id = GETID("名前を付けて保存", "#32770", 5)
if id < then Exit
Sleep(1)
pp = -1
for n = 1 to 3 // 検索項目が付加される事がある為Edit順番を確認
ifb Pos(extens, GetStr(id, n))>0
pp = n
break
endif
next
if pp < 0 then Exit
SendStr(id, fname + extens, pp, True)
Result = ClkItem(id, "保存", CLK_BTN or CLK_MUSMOVE)
Fend
// ダウンロード終了確認、フォルダーを開く
Procedure closeDlg(ieid)
while True
Sleep(1)
n = GETITEM(ieid, ITM_ACCTXT)
if Pos("ダウンロードが完了", ALL_ITEM_LIST[n-1])>0
CLKITEM(ieid, "フォルダーを開く", CLK_BTN)
Exit
endif
Wend
Fend

No.4239 2017/07/18(Tue) 11:21:41

Re: 変数を用いてダウンロード、保存するファイル名の記述方法 / satocha
UWSCはVBAから呼ばれただけで、VBAのことは何も知りません。VBA上の変数をUWSCスクリプトに直接記述しても、未定義エラーになるだけです。

そこで、VBAからUWSCを呼び出すとき、VBAの変数をパラメータとして与えることになります。

UWSC側でパラメータを受け取る方法については、ヘルプのPARAM_STRの項に説明があります。

<起動時パラメーター>
 // スクリプトにパラメーターを付けて起動した場合、その値は配列変数 PARAM_STR[ ] に入る
 PARAM_STR[ ]   // 配列はゼロから

※VBAから別プログラム(今回の場合はUWSC)をパラメータ付きで呼び出す方法は、UWSCの質問ではありませんので、VBAの掲示板等で聞いてください。

No.4241 2017/07/19(Wed) 03:06:28

Re: 変数を用いてダウンロード、保存するファイル名の記述方法 / VBA-IE
satochaさんのご指摘通り、以下を実施してみましたが、うまくいきません。
@VBAからUWSCを呼び出す際にVBAの変数(DLfile)をパラメータとして記述
具体的には、Shell "C:\UWSC\uwsc5302\UWSC.exe DL1.UWS(フルパス指定のUWSスクリプトファイル) DLfile"
AUWSスクリプトファイルでDLfileをPARAM_STR[0]に変更
具体的には、setNameFileDlg(PARAM_STR[0], ".csv")
実行したところ、変数の中身が伝わっていかず、DLfile.csvの名前でダウンロードされました。
本来、変数DLfileは、中身はDL_170721の様な日付情報が入っており、DL_170721.csvの名前でダウンロードしたいのですが。
VBAからUWSCにはパラメータが伝わっているようなので、どこか記述方法が違っているのではないかと思うのですが、教えていただきたく、お願いします。

No.4252 2017/07/21(Fri) 15:04:51

Re: 変数を用いてダウンロード、保存するファイル名の記述方法 / koi
Shell "C:\UWSC\uwsc5302\UWSC.exe DL1.UWS(フルパス指定のUWSスクリプトファイル) DLfile"
↑ の書き方では DLfile という変数の中身渡してるんじゃなくて
DLfile という文字列をスクリプト(UWSC)に渡してますのでそこを修正してください

UWSCの問題じゃないので自分で解決できないなら
satocha さんも書かれてるようにVBA掲示板にでも質問してください

私はVBA知らないので回答もできませんが見てる限り
4238 で回答されてることと同じ過ちを繰り返してるだけの気がします
※ スペース入れろとか言った話じゃなくて書き方もその中に回答されてると思います

No.4253 2017/07/21(Fri) 15:22:33

Re: 変数を用いてダウンロード、保存するファイル名の記述方法 / satocha
いやホントすごいなあ
こう書いてください、と書こうと思ったけど
koiさんのおっしゃる通り、4238に答えが書いてあった
http://www3.rocketbbs.com/13/bbs.cgi?id=umiumi&mode=pickup&no=4238

No.4255 2017/07/21(Fri) 21:09:46

Re: 変数を用いてダウンロード、保存するファイル名の記述方法 / VBA-IE
Koiさん、satochaさんの指摘通り、4238のところを再度読み直し試してみたところ、うまくいきました。
アドバイス、ありがとうございました。

No.4265 2017/07/25(Tue) 10:48:02
セレクトボックスとキーボードの連動 / 谷
セレクトボックスが出現している状態で、
キーボード押下で実行されるように出来ないでしょうか?

例) 
1キーを押下すると1番目の命令、2キーを押下すると2番目の命令…と
いったように実行される

No.4258 2017/07/22(Sat) 14:24:38

Re: セレクトボックスとキーボードの連動 / 谷
実際に自分で書いたものは下記です。

--------------------

A = 1
REPEAT

SELECT SLCTBOX(SLCT_BTN, 0, 1000,600, "操作","左上","右上","左下","右下","終了")
CASE -1
CASE SLCT_1 // 左上
BTN(LEFT,CLICK,700,500)
CASE SLCT_2 // 右上
BTN(LEFT,CLICK,1200,500)
CASE SLCT_3 // 左下
BTN(LEFT,CLICK,700,700)
CASE SLCT_4 // 右下
BTN(LEFT,CLICK,1200,700)
CASE SLCT_5 // 終了
EXITEXIT
SELEND

UNTIL A>2

No.4259 2017/07/22(Sat) 14:38:44

Re: セレクトボックスとキーボードの連動 / yanyan
順番ではないですが、アクセスキー設定が可能です。
SELECT SLCTBOX(SLCT_BTN, 0, 1000,600, "操作","左上(&1)","右上(&2)","左下(&3)","右下(&4)","終了(&5)")

No.4260 2017/07/22(Sat) 20:14:55

Re: セレクトボックスとキーボードの連動 / satocha
UWSCのslcboxの選択肢の上限は31個または無制限です。
なのでユーザが「2」を押したからといって、即2番めの選択肢とはきまらず、もしかすると23番めの選択肢がユーザの意図かもしれません。

なので、選択終了のキーをユーザに入力させることが必要になりますが、それくらいなら、矢印キーで選んでEnterを押すのとさして手間は変わらなくなります。

なので、選択肢は1〜9限定で、数字キーを押したらすぐ結果を出すという場合に限って作ってみました。また、選択肢が6つしかないのに8を押したなどというエラー処理もしていません。

thread pushSlctBox()
sl=SLCTBOX(SLCT_BTN or SLCT_STR,0, 1000,600, "操作","左上","右上","左下","右下","終了")
msgbox(sl)
procedure pushSlctBox()
 title ="UWSC - " + Get_UWSC_Name
 classs ="TUslctBox_uwsc"
 repeat
  ky =0
  for i =1 to 9
   if eval( "GetKeyState( vk_" + i + " )" )
    ky=i
    break
   endif
  next
  if ky =0 then continue
  id  =getid( title, classs, 0.1 )
  if !status( id, st_isid ) then continue
  getitem( id, itm_btn, -1 )
  clkitem( id, All_Item_List[ ky - 1], clk_btn )
 until true
fend

No.4261 2017/07/22(Sat) 20:25:10

Re: セレクトボックスとキーボードの連動 / 谷
yanyan 様
satocha 様

ありがとうございます。
ずばり、私が求めていたものです。
早速使わせていただきます。

ご指導ありがとうございました。


No.4262 2017/07/24(Mon) 09:38:52
ログファイルをスクリプトの途中で変更したい / 森
OPTION LOGPATH = だと、変数や式が使えないので、スクリプト開始時にすでに決定していなければいけません。
スクリプトの途中で何度か変更したいのですが、何か良い方法は無いでしょうか?

No.4242 2017/07/20(Thu) 10:15:28

Re: ログファイルをスクリプトの途中で変更したい / stuncloud
1. printによるロギングを諦めてロギング専用関数を作る
現実的な解だとこれでしょう
例:

procedure print2(log, path)
 print log
 fid = fopen(path, F_READ or F_WRITE)
 gettime()
 t = G_TIME_YY2 + "/" + G_TIME_MM2 + "/" + G_TIME_NN2 + " " + G_TIME_HH2 + ":" + G_TIME_NN2
 fput(fid, t + " " + log)
 fclose(fid)
fend

printしつつ指定パスにログを書くという内容ですね
fopen()を使うとログファイルが肥大化した際に読み書き動作が遅くなるので大量のログを書く場合は別の手段を用いたほうが良いです

2. LOGPATHを書き換えて再実行
無理やりやるパターン
例:

textblock
[option]
endtextblock
OPTION LOGPATH=C:\fuga.log

const LOG_HOGE = "C:\hoge.log"
const LOG_FUGA = "C:\fuga.log"

print "ログ書き込み"

if readini("option", "OPTION LOGPATH", GET_UWSC_NAME) = LOG_HOGE then
 writeini("option", "OPTION LOGPATH", LOG_FUGA, GET_UWSC_NAME)
 poff(P_UWSC_REEXEC)
endif

再実行後に別の処理をさせたい場合はPARAM_STRを使った分岐処理を入れる等の工夫が必要です
その場合はP_UWSC_REEXECじゃなくてexec等で自身を再実行しましょう
書いといてなんですがこんな方法は全くオススメしません

No.4243 2017/07/20(Thu) 11:06:42

Re: ログファイルをスクリプトの途中で変更したい / 森
stuncloudさん

超高速回答ありがとうございます!

> fopen()を使うとログファイルが肥大化した際に読み書き動作が遅くなるので大量のログを書く場合は別の手段を用いたほうが良いです
そう、これがネックなんですよね。
正規のログファイルでも、肥大化が原因だと思うのですが途中から残っていない場合もあって、途中で切り替えてみたいと思ったわけです。

> 書いといてなんですがこんな方法は全くオススメしません
思わず、ほっこりと笑ってしまいました(*´▽`*)
ちょっとカリカリしてきていたので、良いガス抜きをしてもらった感じです。

とりあえず、PRINTした行数は把握できているので、途中で別ファイルに退避することで対処しようと思います。
ありがとうございました。

No.4244 2017/07/20(Thu) 11:31:55

Re: ログファイルをスクリプトの途中で変更したい / stuncloud
> 正規のログファイルでも、肥大化が原因だと思うのですが途中から残っていない場合もあって

OPTION LOGLINESを超えた分かな?と思いましたがそれだと古いログから削除されるはずなのではて…?

> fopen()を使うとログファイルが肥大化した際に読み書き動作が遅くなるので大量のログを書く場合は別の手段を用いたほうが良いです

F_READ or F_WRITE だと一旦ファイルの内容を全部読み取って、書き出すときも全部まるっと書いてるんじゃないかと思ってるんですよね
なのでファイルが大きくなるほど遅くなっちゃう
昔数日に及ぶ作業をさせつつログ取ってたら、恐ろしくパフォーマンスが落ちてひどい目にあいました…
そこで別の手段が欲しくなるというわけです
ログファイルなんかは追記したいだけなのでそういうことができるものを使いましょう

path = "sample.log"
const ForAppending = 8 // 追記
const TristateUseDefault = -2 // システムデフォルト(sjisっぽい)で書く

with createoleobj("Scripting.FileSystemObject")
 with .OpenTextFile(path, ForAppending, TRUE, TristateUseDefault)
  .WriteLine("追記モードで書き込み")
  .Close()
 endwith
endwith

方法は色々ありますがFSOを使ったサンプルを書いてみました
1行300文字*5万行のテキストファイルに対してfopenだと500ミリ秒くらいかかってましたがこれだと15ミリ秒くらいでした
UTF8で書きたい!というような場合だとADODB.Streamあたりが良いかもですね

No.4245 2017/07/20(Thu) 14:11:10

Re: ログファイルをスクリプトの途中で変更したい / satocha
巨大なログに書き込むとなると、追記できる手段が必要だと思います。
思いつくのは
<OLE使用>
1)FileSystemObjectの追記モード
2)ADODB.Stream
<shell系>
3)doscmd("文字列 >> logfile")
4)powershell("文字列 >> logfile")
<powershellコマンドレット>
5)out-fileコマンドレットの-appendオプション使用
6)そのものずばりのadd-Contentコマンドレット
<.Net>
7)powershellでstreamwriteクラスを使う(filemod.appendで)

1はstuncloudさんが説明sしてくださったとおりです。ログ出力にutf-8が使えないことが難点でしょうか。OLEオブジェクトを使うなら、2でしょうか。

3,4は手軽ですが、エンコードが固定されること、出力文字列に改行や引用符が入ってくるとエスケープが大変、などが難点です。

6は書き出し中にreadもロックしてしまうようなので、ログには不向きかもしれません。

7はほかの手段ではできなかったeucでの書き込みにも対応しているので、UNIX系OSと共存するようなシステムでは有効だと思います。ただ、設定が大変そうで、詳しく調べていません。

そこで、5のout-fileで作ってみました。

msgbox( AppendToLog( powershell( "date" )+ logtext,"D:\LOG\log.txt" ) )

textblock logtext
改行やら引用符があるテキスト
改行やら"引用符"があるテキスト
改行やら'引用符'があるテキスト
endtextblock
function AppendToLog( text, log=Get_AppData_Dir+"\UWSC\UWSC.LOG", charset="unicode" )
 src  =replace(_ApprndToLog_ps1,"<TEXT>",text)
 src  =replace(src,"<LOG>",log)
 src  =replace(src,"<CHARSET>",charset)
 result =powershell(src)

textblock _ApprndToLog_ps1
$text =@"
<TEXT>
"@
$log ="<LOG>"
$charset ="<CHARSET>"
$PossibleChars ="unicode,utf7,utf8,utf32,ascii,bigendianunicode,default,oem" -split ","
if ( $PossibleChars -contains $log ){
$charset =$log
$log ="$ENV:APPDATA\UWSC\UWSC.LOG"
}
if ( $PossibleChars -notcontains $charset ){
charset="unicode"
}
$text|out-file -append -encoding $charset $log
endtextblock
fend

No.4247 2017/07/21(Fri) 08:31:11

Re: ログファイルをスクリプトの途中で変更したい / 森
stuncloudさん、satochaさん
ありがとうございます!

扱うのは、UTF-8です。
ログを動作中にチェックしたいからRead Lockはダメ
改行は入りませんが、引用符はシングルもダブルも大量にあります

なので、satochaさんに書いて頂いた 5)out-file を試してみます。
問題があれば、ADODB.Stream ですね。

今日は別の事をやっているので、テストできるのは週明け。
また結果報告します!

No.4248 2017/07/21(Fri) 09:20:33

Re: ログファイルをスクリプトの途中で変更したい / 森
途中報告です。
out-file -append でやってみました。
satochaさんのコードをベースにギリギリまで切り詰めてみましたが、10行のログ出力だけで6秒掛かりました。
残念ながら実用的では無かったです。
行けそうな気がしていたのですが、実際にやってみないと分らないものですね・・・
次は、ADODB.Stream で試してみます。

AppendToLog.uws
---------------------------------
dim log_data[]="あんず","いちご","イチジク","オレンジ","かぼす","柿","キウイ","栗","グレープ","さくらんぼ"
for text in log_data[]
AppendToLog( text , "hoge.log")
next

procedure AppendToLog( text, log_file )
print text
src = "(Get-Date).ToString(<#DBL>yyyy/mm/dd hh:mm:ss<#DBL>) + <#DBL> " + text + "<#DBL> | out-file -Encoding UTF8 -append " + log_file
powershell(src)
fend

hoge.logの出力結果
---------------------------------
2017/32/21 09:32:40 あんず
2017/32/21 09:32:41 いちご
2017/32/21 09:32:42 イチジク
2017/32/21 09:32:42 オレンジ
2017/32/21 09:32:43 かぼす
2017/32/21 09:32:43 柿
2017/32/21 09:32:44 キウイ
2017/32/21 09:32:45 栗
2017/32/21 09:32:45 グレープ
2017/32/21 09:32:46 さくらんぼ

No.4256 2017/07/21(Fri) 21:43:00

Re: ログファイルをスクリプトの途中で変更したい / 森
実用速度になりました。
読めれば良いので、FSOのUTF-16でも問題ないと思いますが、ADODB.StreamだとUTF-8(ただしBOM付)で書き出せるので、今回の私のケースではADODB.Streamを採用することにしました。
速度的にはどちらも高速で満足です。
ちなみにOut-Fileは、Out-File自体の処理が遅いのではなく、PowerShell()での実行が遅いのかなという感じですね。
stuncloudさん、satochaさん、ありがとうございました。
---------------------------------------
dim log_data[]="あんず","いちご","イチジク","オレンジ","かぼす","柿","キウイ","栗","グレープ","さくらんぼ"
for log_str in log_data[]
 log_print( log_str , "hoge.log")
 log_print2( log_str , "hoge2.log")
next

// FSO(stuncloudさんのコードをベースにUnicodeに変更)
procedure log_print(log_str , path)
 print log_str
 gettime()
 t = G_TIME_YY2 + "/" + G_TIME_MM2 + "/" + G_TIME_NN2 + " " + G_TIME_HH2 + ":" + G_TIME_NN2 + ":" + G_TIME_SS2
 log_str = t + " " + log_str
 with createoleobj("Scripting.FileSystemObject")
  with .OpenTextFile(path, 8 , TRUE, -1 )
   .WriteLine(log_str)
   .Close()
  endwith
 endwith
fend

// ADODB.Stream(UTF-8 ただしBOM付)
procedure log_print2(log_str , path)
 print log_str
 gettime()
 t = G_TIME_YY2 + "/" + G_TIME_MM2 + "/" + G_TIME_NN2 + " " + G_TIME_HH2 + ":" + G_TIME_NN2 + ":" + G_TIME_SS2
 log_str = t + " " + log_str
 with createoleobj("ADODB.Stream")
  COM_ERR_IGN
   try
    .Mode = 16 // 読み取り/書き込みモード 排他しない
    .Type = 2
    .Charset = "UTF-8"
    .Open
    .LoadFromFile (path) // logファイルが無い時、ここでエラーになる
    .Position = .Size // ポインタを終端へ
   finally
    .writeText(log_str , 1)
    .SaveToFile(path , 2)
    .Close
   endtry
  COM_ERR_RET
  EndWith
fend

No.4257 2017/07/22(Sat) 11:20:19
ウィルス対策ソフトでexeuws.exeがウィルス検知される / ビギナー
公式ページからDLした5302ですが、SymantecでTrojan Horseとして検疫されてしまいます。
No.4246 2017/07/20(Thu) 16:44:21
UWSスクリプトファイルが見つからない / VBA-IE
UWSCの実行ファイルをC:\UWSC\uwsc5302に、スクリプトファイルDL.uwsをC:のルートに置き、
以下を実行するが、UWSCでDL.UWSファイルが見つからないとエラー表示される。
ファイルのパスは合っていると思いますが、ファイルを見つけてくれない原因は何で、どのように
修正すれば良いかお教え願います。

Dim Fname As String
Fname = "c:\DL.uws" 'UWSスクリプトファイル名指定
Shell "C:\UWSC\uwsc5302\UWSC.exe /L" & Fname

No.4232 2017/07/13(Thu) 15:53:00

Re: UWSスクリプトファイルが見つからない / stuncloud
/L の後に半角スペースないからでは
>C:\UWSC\uwsc5302\UWSC.exe /Lc:\DL.uws
となってるので /Lc:\DL.uws なんてファイルないよと言われているんだと思います

# /L ってなんだ

No.4233 2017/07/13(Thu) 17:05:06

Re: UWSスクリプトファイルが見つからない / routa
ルートや"Program Files"以下に勝手にファイルを置くのは禁止されてます。
置いてしまうとVirtualStoreが働きます。
VirtualStoreについては検索で調べて下さい。

No.4236 2017/07/15(Sat) 01:54:47

Re: UWSスクリプトファイルが見つからない / VBA-IE
教えて欲しいのは、UWSCのスクリプトファイル名を変数を用いて指定する記述方法です。
記述を色々変えて実行した結果は以下です。
@Shell ("C:\UWSC\uwsc5302\UWSC.exe /L" & Fname) => VBA実行時エラー ファイルがみつかりません
AShell ("C:\UWSC\uwsc5302\UWSC.exe /L & Fname") => UWSCでFILE not found :&Fname.uws とエラー表示
BShell ("C:\UWSC\uwsc5302\UWSC.exe /L & Fname) => VBAでコンパイルエラー
CShell ("C:\UWSC\uwsc5302\UWSC.exe /L" & Fname") => VBAでコンパイルエラー

なお、ファイル名を変数を使わずに以下の様にフルパスで指定するとうまくいきます。
Shell "C:\UWSC\uwsc5302\UWSC.exe /L c:\DL.uws"

スクリプトファイル指定を変数を使って記述する方法を教えてください。

No.4237 2017/07/18(Tue) 10:42:31

Re: UWSスクリプトファイルが見つからない / stuncloud
> /L の後に半角スペースないからでは
って書いたの伝わってないですね
わりと直接的な答え書いたつもりだったんですけど全部書いて見せないとわからないのかしら、すごいなー
こうです、こう書いてください

Shell "C:\UWSC\uwsc5302\UWSC.exe /L " & Fname

/Lの後に半角スペースがあるのがわかるでしょうか、こう書くことに気付いてもらいたかったんですがとても残念です
ちなみになぜそこまで答えなかったかというと質問の内容も答えもUWSC関係ないからです、だってVBAの話なんだもの
本来ならVBAの質問に答える義理はないんですよ、ここUWSC掲示板ですし

No.4238 2017/07/18(Tue) 11:11:43

Re: UWSスクリプトファイルが見つからない / VBA-IE
stuncloud様

ご指摘の通り、/Lの後に半角スペースを入れたらうまくいきました。
他にもうまくいっていない個所もあり混乱していて、以前の回答をじっくり読めていなかった様です。
助かりました。ありがとうございます。

No.4240 2017/07/18(Tue) 14:22:02


 過去ログ(〜2017/08/24)・検索ツール


以下のフォームに記事No.と投稿時のパスワードを入力すれば
投稿後に記事の編集や削除が行えます。
200/200件 [ ページ : << 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ... 20 >> | 過去ログ ]