数字当てゲームをダウンロードさせていただきました。
試してみたところ、例えば、コンピューターが、「542」を選んだ場合、自分が「122」と入れると、1hit 1dorw と表示されてしまいます。
どうにかできないでしょうか。
以下の内容ですが、自己解決しました。
VBSを管理者として実行することで解決しました。
詳細はURLをご参照ください。
こんにちはVBSで困っていることがあります。
力をお貸し下さい。
OS:Windows7 pro
【やりたいこと】
ファイルサーバからFilecopyを使用してC:\Program Files\Common Files\ODBC\Data Sourcesへファイルをコピーしたい。
【ソース】
Option Explicit
Dim objFSO
Dim strCopyFile1
Dim strCopyFile2
Set objFSO = CreateObject("Scripting.FileSystemObject")
strCopyFile1 = "\\testsvr\test\test.dsn"
strCopyFile2 = "C:\Program Files\Common Files\ODBC\Data Sources\test.dsn"
objFSO.CopyFile strCopyFile1, strCopyFile2, True
msgbox "完了しました"
Set objFSO = Nothing
【考察】
エクスプローラでC:\Program Files\Common Files\ODBC\Data Sources以下にファイルコピー時はアクセス許可を求められますので、それが原因かと考えています。
思い通りにコピーする方法等ご存知の方おられましたら助けて下さい。
超初心者さん
肝心の xhr.responseText がコメントアウト(//の後は注釈扱いで無視されます)されているので、そのせいで動いていないように見えるのでは?
自宅サーバでWSHをCGIとして動かしています。
WWWサーバはAbyss X1で、ASP.NETは使っていません。
JScript、VBScriptによるファイルアップロードCGIに必要なコードや知識を探しています。
よろしくお願いします。
xpで動いていたスクリプトを、
Windows7に移植したら動かなくなりました。
スクリプトは下記です。
var xhr = WScript.CreateObject("MSXML2.XMLHTTP");
xhr.open("GET", "http://192.168.0.1/index.asp");
xhr.send();
while( true )
{
WScript.Sleep(100);
if( xhr.readystate == 4 )
{
//WScript.Echo( xhr.responseText );
WScript.Quit();
}
}
素人なもので困っています。
どなたか、お知恵を貸して下さい。
お願いします。
始めまして。
初心者過ぎて恐縮なのですが・・・
WSHであるページのリンクだけを抜いて、そのリンク先だけを順次巡回しておりました。
そのあるページが仕様変更致しました。
簡単に言うとこのような感じのページになりました。
ttp://ameblo.jp/new-blue-777/archive-201206.html
こう言った場合、例えばメニューの『記事』とか『コメント』とか『よくある質問』とかが、ページ上段の写真の直下にありますが、ここだけを片っ端からクリックする方法などはあるのでしょうか?
>shum さん
こちらでも確認してみましたが、確かにEmptyな変数に対して論理演算子を使うとLong型の0が代入されますね。
しかしなぜそうなるのか、理由は私にはわかりません。すみません。
VBScript or VBの言語仕様なんでしょうか…。
Empty値を、代入さえしなければいつまでもEmptyであると期待して扱っていると思わぬ落とし穴にはまりそうですね。
パターンとしては、変数宣言→On Error Resume Next内で変数にメソッドの結果代入→If文で変数を論理演算→その変数がEmptyかどうか調べる
みたいな流れのときに。
エラー処理の中で、メソッドが失敗して変数がEmptyのままなら、その変数に何らかの無効値(0とかFalseとか、変数に応じて)を入れておくべきなのかもしれません。
あるいは変数は必ず初期値を入れておくのが安全かもしれません。
要らん事してしまったようですorz
もう一度、例文コードを載せます。ごめんなさい
'−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
Dim bFlg
If Not bFlg Then
'本来ここで何か処理を行う
End If
MsgBox IsEmpty(bFlg) & "," & TypeName(bFlg) & "," & bFlg 'False,Long,0 となっている!
'−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
初めまして。
VBScriptでなんだか不自然な現象を発見したのでここに投稿します。 常識または既出だったらスミマセン
WSH5.7 on Windows Vistaを使用してます。
[現象:Empty値の入った変数を式の中で論理演算子と組み合わせて使用すると、0(Long型)が代入される]
初めまして。
VBScriptでなんだか不自然な現象を発見したのでここに投稿します。 常識または既出だったらスミマセン
WSH5.7 on Windows Vistaを使用しています。
[現象:Empty値の入った変数を式の中で論理演算子と組み合わせて使用すると、0(Long型)が代入される]
例えば、下記のような感じです。
'−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
Dim bFlg
If Not bFlg Then
'本来ここで何か処理を行う
End If
MsgBox IsEmpty(bFlg) & "," & TypeName(bFlg) & "," & bFlg 'False,Long,0 となっている!
'−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
以下も同様です。
If bFlg And 条件 Then
If bFlg Or 条件 Then
以下は大丈夫(Emptyのまま)です。
If bFlg Then
If bFlg = 0 Then
If bFlg + 1 Then
If IsEmpty(bFlg) Then
If文の条件式だけではなくて、代入式の右辺などで使用しても全て同じ結果です。
どうも書いたコードがうまく動作しなくて、この現象に気づくまで軽くハマッってしまいました。
なんだか腑に落ちない現象ですね。
>牟田口大介 さん
>インクルードするファイルに記述する関数を
>function test(a){WScript.Echo(a)}
>ではなく
>test=function(a){WScript.Echo(a)}
>のように記述しておくと、呼び出し元スクリプトのfunction内でevalしても、test関数はグローバルで実行できるみたいです。
なるほど。グローバル変数への代入の形で書けば、どこで実行されても同じか。
自分用のライブラリ参照はそのやり方を使ってみますわ。
>WSHでは関数のインクルードは.vbsや.jsではなく、.wsfファイルでやるのがお作法なんでしょうね。
本来そうなんでしょうけど、
企みの一つは、インクルード対象をWEB上から持ってこようとしているので。
最終的には
use("function tr");
みたいな書法を取り入れたいな、と。
最小限の自分用スクリプトのテンプレート作っておいて
あとの機能追加は必要に応じて個別に。
>aMI_KUH95291 さん
インクルードするファイルに記述する関数を
function test(a){WScript.Echo(a)}
ではなく
test=function(a){WScript.Echo(a)}
のように記述しておくと、呼び出し元スクリプトのfunction内でevalしても、test関数はグローバルで実行できるみたいです。
ただ、どうもevalで実行するスクリプトは、セキュリティ制限が通常よりきつくなるらしくて、たとえばファイルを読み書きするコードをevalしても動かなかったりするらしいです。
WSHでは関数のインクルードは.vbsや.jsではなく、.wsfファイルでやるのがお作法なんでしょうね。
.wsfは色々とめんどくさいですけども。
>牟田口大介 さnn
>「関数のインクルードは初期処理ではなく、あくまでインクルードである」と考えれば、そこだけ冒頭に持ってきてもいいんじゃないでしょうか。
あ。まさしくそうですよねえ。
単に初期化の一環と考えてましたが
「どんな外部ソースを使っているか」は隠蔽してしまわず冒頭に置くべきでしょう。
それはそれとして、結局、function内で
Global.eval(ほげほげ) とかやっても
少なくともWSH上では思うように動いてくれないんですよね。
(当然、適宜Globalはなんらかの方法で設定しておくという前提で。)
グローバルなプロパティやメソッドの設定は Global 使ってうまくいきましたが
あとは eval だけなんですよねー。
実用的には牟田口大介さんの言われる通りで問題ないのですが。
なんか、気になります。
>aMI_KUH95291 さん
「関数のインクルードは初期処理ではなく、あくまでインクルードである」と考えれば、そこだけ冒頭に持ってきてもいいんじゃないでしょうか。
その場合、
eval(別ファイル内容);
初期化();
主処理
function 初期化(){}
という構造になるかと思います。
他の言語構文と照らしても、インクルード部分だけ冒頭に持ってくるのはそれほど違和感がないように思います。
あ。
逆に主処理を function main() にして、
一番底から呼び出す、という手はあるな。
WSH/JScriptのevalについてです。
他ソースのincludeの仕組みを作ろうとしているのですが
「evalは実行時のスコープに依存する」ので
グローバルなfunctionの追加とかを行うには
evalをトップレベルで直接記述するしかありません。
初期化の処理とかは、まとめて後ろの方に置きたいのですが
それだとfunction呼び出しになるので、include用のevalが書けません。
なにかエレガントな解決方法はないでしょうか?
>牟田口大介 さん
いえいえ。諦めて別IE立ててやります。
「できること」は調べればたいていわかるんですが
「できないこと」は見切るのがなかなか難しいので。
参考になりました。ありがとうございます。
>aMI_KUH95291 さん
私もいい方法が思いつかないです。すみません。
IEはタブ化してから外から扱いにくくなりましたよね。
もっとも外から扱うことはあまり想定されていないのだとは思いますが…。
牟田口大介 さん、さっそくどうも。
ですよねー。やっぱり。
新たにIE立てるのではなく
既設のIEにタブ足して自動運転、てのをやろうといろいろ試しているところです。
DocumentComplete や OnQuit をうまく扱うか
何か代わりのいい方法はないもんでしょうかね。
>aMI_KUH95291 さん
WScript.ConnectObject()で既存のオブジェクトのイベントを捕捉できるのですが、残念ながらIEオブジェクトは対応していないので不可能、ということだったと記憶しています。
IE(Window)オブジェクトのDocumentプロパティから辿れるDOMオブジェクトのイベントは、GetRef関数で関連付けできたりはしますが、Windowオブジェクトそのもののイベントは取れなかったと思います。
イベントハンドラのプリフィックス指定付のWScript.CreateObjectからではなく
Shell.ApplicationのShellWindowsコレクションから捕まえた
既存のIEのイベントを取ることはできるんでしょうか。
いろいろ試しているのですが、どうもうまくいきません。
管理人牟田口大介 さん ありがとうございます。
はい、1) は手動でタスクスケジューラに登録するということです。
はい、3) はMozBackupが行う処理です。
求める情報はほぼもらえたと思います。
時間を見つけて1週間以内に作成して、ここに投稿して、添削してもらいたいと希望します。
>BAT VBS やや経験有 さん
1)は手動でタスクスケジューラに登録するということでしょうか?
2)はWshShell.RunもしくはWshShell.Execで可能と思います。
3)はMozBackupが行う処理ということで、スクリプト上は特に処理をしなくてもいいということでしょうか。
4)はファイル数の数はまずFileSystemObjectオブジェクトのGetFolderメソッドでFolderオブジェクトを取得し、Folder.Files.Countプロパティの値を調べればいいかと思います。
もっとも古い.pcvファイルがどれかを調べて削除するには、
a) もっとも古い最終更新日時を持つファイル名を格納する変数宣言
b) もっとも古い日時を格納する変数宣言。未来の日時を代入して初期化しておく。
c) Folder.Filesコレクションに対してFor EachでFileオブジェクトを列挙
d) ループ中で、まず拡張子を調べて該当のものだけ対象とする。
if LCase(FileSystemObject.GetExtensionName(File.Name))="pcv" then
ファイル名の絞り込みを拡張子だけではできない場合は、さらにinstr関数などを使って絞り込む。
e) ループ中で、現在チェック中のファイルの最終更新日時(File.DateLastModified)とb)で作った変数を比較演算し、b)の方が古ければ何もしない。b)の方が新しければ、そのファイルの最終更新日時をb)に代入し、ファイルパス(File.Path)をa)に代入する
f) ループを抜けた後で、a)に代入されているファイル名に対し、FileSystemObject.FileDeleteメソッドを実行。
以上のようにすればできるかと思います。
何かわからないことがありましたら、またご質問ください。
初めて投稿します。10日程度で解決したい相談を投稿します。
WinXP で実行中のアプリを For each で取得して、taskkill で強制終了する VBS 程度でしたらネット情報を参照して作成した経験があります。
下記の今回の相談について「このURLの記載と、このURLの記載を組み合わせれば可能」等の、何かヒントになる情報をもらえましたら助かります。
今回、Thunderbird をバックアップできる MozBackup はコマンドラインで実行できる事を知りました。
そこで、WinXP タスクスケジュールに、次の様な手順のスクリプトを登録して、MozBackup を自動実行したいです。VBSに限らず、何でも構いません。
0)予め手動で、LAN上に共有フォルダ \\192.168.xxx.xxx\share\Backup を作成しておき、
1)週1回、タスクスケジューラを用いて、スクリプトを実行して、
2)"MozBackup.exe Thunderbird.conf" を実行して、
3)バックアップファイル Thunderbird *.PCV が共有フォルダに作成されて、
4)共有フォルダの Thunderbird *.PCV の数が 11 になっていれば、最も古い Thunderbird *.PCV を削除して、
5)スクリプトは終了する。
早々のご回答ありがとうございます。
やっぱり、やってみないとわかりませんね。
コード作成して、実行して結果を見たいと思います。
アドバイスありがとうございます。
また、ご相談させてください。
>Gowasu_na さん
どちらが速いかは私も何とも言えないですね。ぜひやってみてください^^
中間ファイルを作る手順が省けるのでその分後者が速い気がしないでもないですが、確信は持てません。
ただファイル名以外の情報を逐一FileSystemObjectで取得するのであれば、結局そこがボトルネックになって全体の処理は遅くなる可能性もあります。
しかし件のサンプルのようにFSOだけで再帰処理で全部こなすよりは速くなる可能性もなきにしもあらずで、やっぱり実際にやってみないと分からないですね。