私もやってみました。.NETは速いですね〜。
LenDW
---------------------------
10000000
0.109375
---------------------------
20000000
0.203125
---------------------------
LenA
---------------------------
10000000
9.96875
---------------------------
20000000
14.04688
---------------------------
LenNET
---------------------------
10000000
0.09375
---------------------------
20000000
0.140625
---------------------------
//SjisString.js
//コンパイルは jsc.exe /t:library SjisString.js
//生成したSjisString.dllをC:\Windows\System32にコピーし、
//regasm SjisString.dll を実行
import System;
import System.Text;
package SjisString{
class SjisString{
private var sjis : Encoding = Encoding.GetEncoding("shift-jis");
private var m_string : System.String ="";
function set Contents(s : System.String) {
this.m_string = s;
}
function get Contents() : System.String {
return m_string;
}
function GetByteCount() {
return sjis.GetByteCount(m_string);
}
}
}
'呼び出し
Set component = WScript.CreateObject("SjisString.SjisString")
Dim StartTime,sa,sw
sa=String(10000000,"a")
sw=String(10000000,"あ")
StartTime=Timer
wscript.echo LenA(sa)&vbLf&(Timer-StartTime)
StartTime=Timer
wscript.echo LenA(sw)&vbLf&(Timer-StartTime)
Function LenNET(str)
component.contents=str
LenNET=component.GetByteCount
End Function
>鈴木 さん 2005年 06月 24日 11時 31分 27秒
>各種.dllを右クリック->プロパティで表示されるタブ:バージョン情報を取得する方法は無いでしょうか
甲案 "Shell.Application"
Set Shell=CreateObject("Shell.Application")
Set Folder=Shell.NameSpace(Left(path,InStrRev(path,"\")))
Set FolderItem=Folder.Items.Item(Mid(path,InStrRev(path,"\")+1))
WScript.Echo Folder.GetDetailsOf(FolderItem,k)
ここで、
k Folder.GetDetailsOf(,k)
35 会社名
36 説明
37 ファイル バージョン
38 製品名
39 製品バージョン
或いは、
FolderItem.ExtendedProperty("Company")
FolderItem.ExtendedProperty("FileDescription")
FolderItem.ExtendedProperty("FileVersion")
FolderItem.ExtendedProperty("ProductName")
FolderItem.ExtendedProperty("ProductVersion")
でも同じ。
因みに、その他の対応は、
FolderItem.ExtendedProperty("Directory")'2 -
FolderItem.ExtendedProperty("Type")'4 2
FolderItem.ExtendedProperty("Name")'10 0
FolderItem.ExtendedProperty("Size")'12 1
FolderItem.ExtendedProperty("Attributes")'13 6
FolderItem.ExtendedProperty("Write")'14 3
FolderItem.ExtendedProperty("Create")'15 4
FolderItem.ExtendedProperty("Access")'16 5
FolderItem.ExtendedProperty("Owner")'- 8
ここで、コメントの数字は'pid k
FolderItem.ExtendedProperty("{B725F130-47EF-101A-A5F1-02608C9EEBAC}" & pid)
です。
乙案 FILEVER.EXE
Prints file version information.
C:\PROGRA~1\SUPPOR~1\FILEVER.EXE [/S] [/V] [/E] [/X] [/B] [/A] [/D] [[drive:][path][filename]]
/S Displays files in specified directory and all subdirectories.
/V List verbose version information if available.※←これ。
/E List executables only.
/X Displays short names generated for non-8dot3 file names.
/B Uses bare format (no dir listing).
/A Don't display file attributes.
/D Don't display file date and time.
丙案 IE
IEのAddressBarに
res://IEXPLORE.EXE/%2316/1
みたいに入れる。
これをバイナリで保存する。以下を参照。
>ばんのしゃーによかばんた さん 2005年 06月 15日 16時 10分 01秒
>■IEの「ソースの表示」の「メモ帳」で、文字化けや、バイナリだったらどうするか?
>管理人むたぐち さん 2005年 06月 25日 02時 53分 09秒
>バイト数を正しく返すLen関数は、WinXPならこういう手もあります。
またも、HomeEditionには有りませぬ。
で、MVPで貰ったMSDNの中をごそごそ探してみるとありました。
中を見ると、"ScriptPW.Password.1"なんてのありますが、
これも、Proにはあるのですか?
HomeEditionにはなかったので、XP紹介記事の誤りかと思ってました。
もし、あるんでしたら、ファイル名を教えてくださいまし。
またまたすいません。GetBSTRAddr()の
cは少なくとも4バイト取ってください。
Const c="**" ←こうすりゃ良かったんだ
スペースがまとまることを失念してました。
あまりに遅かったので反則(DynacallによるWin32API
呼び出し)してみました。NT系では動かないかも知れません。
またちゃんと確認してないので文字列終端が異常になって
長さが±するかもしれません(無責任)。
私の環境ではDynaWrapはこういうとき
助かります。← VB.NET使え
Function LenDW(s)
Dim buf
Dim sbstrp, bufbstrp
Dim w1,w2
Dim dw, dw2
Set dw=CreateObject("DynamicWrapper")
Set dw2=CreateObject("DynamicWrapper")
dw.Register "kernel32.dll","lstrlenA","f=s","i=l","r=l"
dw2.Register "kernel32.dll","WideCharToMultiByte","f=s","i=llllllll","r=l"
buf=String(Len(s), Chr(0))
sbstrp=GetBSTRAddr(s)
bufbstrp=GetBSTRAddr(buf)
dw2.WideCharToMultiByte 0,0,sbstrp,-1,bufbstrp,Len(s)*2,0,0
LenDW=dw.lstrlenA(bufbstrp)
End Function
Function GetBSTRAddr(ByRef s)
Const c=" "
Dim cp,sp,sbstrp
Dim w1,w2
Dim dw3, dw4
Set dw3=CreateObject("DynamicWrapper")
Set dw4=CreateObject("DynamicWrapper")
dw3.Register "kernel32.dll","lstrcat","f=s","i=ws","r=l"
dw4.Register "kernel32.dll","RtlMoveMemory","f=s","i=lll","r=l"
cp=dw3.lstrcat(c, "")
sp=dw3.lstrcat(s,"")
dw4.RtlMovememory cp, sp+8, 4
w1=Ascw(Left(c, 1)) and &h0000ffff&
w2=Ascw(Mid(c, 2, 1))
GetBSTRAddr=w2*&h10000 + w1
End Function
Dim StartTime,sa,sw
sa=String(1000000,"a")
sw=String(1000000,"あ")
StartTime=Timer
wscript.echo LenDW(sa)&vbLf&(Timer-StartTime)
StartTime=Timer
wscript.echo LenDW(sw)&vbLf&(Timer-StartTime)
結果
LenDW
---------------------------
1000000
0.3203125
---------------------------
2000000
0.28125
---------------------------
バイト数を正しく返すLen関数は、
WinXPならこういう手もあります。
Set component = CreateObject("Microsoft.CmdLib")
msgbox component.LengthinBytes("123あ")
Microsoft.CmdLibの実体は、C:\Windows\system32\cmdlib.wscです。
LengthinBytesメソッドの正体は…想像通りです。
# eventquery.vbsを読んでいて見つけました。
# ちなみに、うちの環境(ワークグループ)でもXP proから
# Server 2003のイベントログは取得できました。
# RemoteWSHは相変わらず動かないですけど…
比較するものがないですね。すいませんでした。
当環境での結果
LenA
---------------------------
1000000
7.959961
---------------------------
2000000
11.53027
---------------------------
LenA2(以前と同じ)
---------------------------
1000000
9.719971
---------------------------
2000000
10.77002
---------------------------
To もーん さん 2005年 06月 24日 21時 40分 58秒
> eventquery.vbsを使用し、Localドメイン内の他サーバのイベントログを取得したいのですが、
eventquery.vbs は、内部ではWMI(Win32_LogEvent)を利用して、
EventLogのQueryを行っているので、ShootingはWMIと変わらないでしょう。
双方のOSは? Userの指定は?
RPC(135)がFirewall等でBlockされていないか確認されてはいかが?
あと、せめてどのようにダメだったか、Error Message の掲示は
最低限必要でしょうね。
とりあえず、私の環境 Windows XP Professional から
Windows Server 2003 では正常に実行されますね。
>>ばんのしゃーによかばんた さん
1,0だけをみるならこうするのも手かなと
思って試して見ました。私の環境では
ASCII単体はLenAより遅くなりましたが
SHIFT-JIS単体は若干早くなりました。
全然アドバンテージは有りませんが…
Function LenA2(str)
Dim i
LenA2=Len(str)
For i=1 To LenA2
LenA2=LenA2-(Asc(Mid(str,i,1))<0)
Next
End Function
Dim StartTime,sa,sw
sa=String(1000000,"a")'<-念のため時間
sw=String(1000000,"あ")'<-計測領域から分けました
StartTime=Timer
wscript.echo LenA2(sa)&vbLf&(Timer-StartTime)
StartTime=Timer
wscript.echo LenA2(sw)&vbLf&(Timer-StartTime)
結果(ロートル環境なので激しく遅い)
---------------------------
1000000
9.719971
---------------------------
2000000
10.77002
---------------------------
To: 鈴木 さん
FileSystemObjectのGetFileVersionメソッドを使えば、
バージョン番号を取得することができます。
ほかのバージョン情報を取得する方法はちょっとわかりません。
JScript.NETなら簡単なんですけどね。
以下は、じゃんぬさんのサイトにあるC#のコード
(http://jeanne.wankuma.com/tips/file/12-versioninfo.html)を
JScript.NETに書き換えたものです。
var FileVersionInfo : System.Diagnostics.FileVersionInfo;
FileVersionInfo = System.Diagnostics.FileVersionInfo.GetVersionInfo("C:\\WINDOWS\\System32\\shell32.dll");
System.Console.WriteLine("ファイル名 : " + FileVersionInfo.FileName);
System.Console.WriteLine("ファイルの説明 : " + FileVersionInfo.FileDescription);
System.Console.WriteLine("コメント : " + FileVersionInfo.Comments);
System.Console.WriteLine("会社名 : " + FileVersionInfo.CompanyName);
System.Console.WriteLine("製品名 : " + FileVersionInfo.ProductName);
System.Console.WriteLine("著作権: " + FileVersionInfo.LegalCopyright);
System.Console.WriteLine("商標: " + FileVersionInfo.LegalTrademarks);
System.Console.WriteLine("正式ファイル名 : " + FileVersionInfo.OriginalFilename);
System.Console.WriteLine("内部名 : " + FileVersionInfo.InternalName);
System.Console.WriteLine("言語 : " + FileVersionInfo.Language);
eventquery.vbsを使用し、Localドメイン内の他サーバのイベントログを取得したいのですが、のエラーがでてうまくいきません。ローカルの場合はうまくいったのですが・・・。情報が少なく例がないため試行錯誤を繰り返しております。MSDNのサイトよりもよい例などないでしょうか?
各種.dllを右クリック->プロパティで表示されるタブ:バージョン情報を取得する方法は無いでしょうか?
魔界の仮面弁士さま、むたぐちさま、ありがとうございます。
調べてもわからなかった理由も納得がいき、すっきりすることができました。
しかしMVPの皆さまの世界の話とは。
広告までも少数精鋭とは、さすが、恐れ入りました。
さすがに画像の無断使用はまずいと思うので、
私はテキストリンクを貼るだけにしておきます。
本当にありがとうございました。
「ファイルを開く」、「名前を付けて保存」ダイアログで
フォルダを移動するのが、まどろっこしくって面倒です。
フォルダのトリービューで、もっと簡単に移動できないものか。
ということで、作ってみました。
「ファイルを開く」や「名前を付けて保存」ダイアログが表示された状態で、
BrowseForFolderWithOpenFile.VBSを起動します。
「マイドキュメント」などに入れておくと、
「ファイルを開く」や「名前を付けて保存」ダイアログで、
「プレースバー」から「マイドキュメント」を開き、そこから、
BrowseForFolderWithOpenFile.VBSを右クリックで起動できます。
BrowseForFolderWithOpenFile.VBS
――――――――――――――――――――――――――――――――――――――
Option Explicit
Const BIF_RETURNONLYFSDIRS=&H1 'File System Directory
Dim Shell
Dim Folder
Dim FolderItem
Dim Path
Dim wShell
Set Shell=CreateObject("Shell.Application")
Set Folder=Shell.BrowseForFolder(0,"Select Folder",BIF_RETURNONLYFSDIRS)
If Folder Is Nothing Then WScript.Quit
Set FolderItem=Folder.Items.Item
If FolderItem Is Nothing Then Set FolderItem=Folder.Self
Path=FolderItem.Path
If IsNull(PutClipByMsForms(Path)) Then Call PutClipByMsIE(Path)
Set wShell=CreateObject("WScript.Shell")
If wShell.AppActivate("ファイルを開く") Then
WScript.Sleep 100
wShell.SendKeys "%n^a^v{Enter}"
ElseIf wShell.AppActivate("名前を付けて保存") Then
WScript.Sleep 100
wShell.SendKeys "%n^a^v{Enter}"
ElseIf wShell.AppActivate("ファイルの選択") Then
WScript.Sleep 100
wShell.SendKeys "%n^a^v{Enter}"
ElseIf wShell.AppActivate("開く") Then
WScript.Sleep 100
wShell.SendKeys "%n^a^v{Enter}"
End If
WScript.Quit
Function PutClipByMsIE(args)
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=args
ie.ExecWB OLECMDID_SELECTALL,OLECMDEXECOPT_DODEFAULT
ie.ExecWB OLECMDID_COPY,OLECMDEXECOPT_DODEFAULT
ie.Quit
Set ie=Nothing
End Function
Function PutClipByMsForms(args)
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=args
tb.SelStart=0
tb.SelLength=tb.TextLength
tb.Copy
Set tb=Nothing
Set uf=Nothing
End Function
手作りのLenA()は、兎角、遅いのなんの、と言われますが、
最速を目指して、私も改めて作ってみました。
Function LenA(str)
Dim k
LenA=Len(str)
For k=1 To LenA
If Asc(Mid(str,k,1))<0 Then LenA=LenA+1
Next
End Function
実装仕様に依存しているかも知れません。
※Mid(str,k)よりMid(str,k,1)が速い。strが長〜いときに差が出る。
n**2効果だと思う。
※SJISの場合、Asc()<0で全角/半角が区別可能。
気持ち悪いければ、If Asc(Mid(str,k,1)) And &HFF00 Thenに変えても、
性能はあまり変わらないと思う。
→少し遅い。
※For To 「式」 は最初に一度だけ評価される。
気持ち悪いければ、For k=1 To Len(str)に変えても、差はたぶんない。
→同じ。
StartTime=Timer
MsgBox LenA(String(1000000,"a"))&vbLf&(Timer-StartTime)
StartTime=Timer
MsgBox LenA(String(1000000,"あ"))&vbLf&(Timer-StartTime)
の結果は、
---------------------------
1000000
1.4375
---------------------------
2000000
1.90625
---------------------------
一方、Len2()は、同じ桁だと、なかなか帰ってこないので、1桁落として、
StartTime=Timer
MsgBox Len2(String(100000,"a"))&vbLf&(Timer-StartTime)
StartTime=Timer
MsgBox Len2(String(100000,"あ"))&vbLf&(Timer-StartTime)
---------------------------
100000
14.71094
---------------------------
200000
14.67188
---------------------------
あまりにもspamが多いので、ちょっと対策を施しました。
投稿の際は、書き込むボタンの上のチェックボックスをオンにしてください。
これで自動spam投稿は弾ける…かも。
管理人により削除
管理人様
もっと調べてから投稿するべきでしたが、この問題だけで、昨日から丸一日ハマってしまってたもので・・・。
ありがとうございました。
To: 新米MCP さん
「資格取得キャンペーン」のリンクについては、魔界の仮面弁士さんのおっしゃるとおり、Microsoftからリンク依頼を受けて貼ったものです。自由に貼っていいものかどうかはちょっとわかりません、ごめんなさい。
# でもMicrosoft的には、いっぱい宣伝してもらったほうが良いような気もします。
To: おれおれ。 さん
解決されたとのことですが、時間差でコードを書いてしまったので
せっかくなので載せておきますね。
# リンク先とほぼ同じコードですね
Function Len2(strString)
nCount = 0
For I = 1 To Len(strString)
nCode = Asc(Mid(strString,I))
If nCode >= 0 And nCode <= 255 Then
nCount = nCount + 1
Else
nCount = nCount + 2
End If
Next
Len2 = nCount
End Function
管理人により削除
すみません、解決してしまいました。
http://www.bsc-j.com/~moritake/oboegaki/h_vbs_fnc03.html
はじめまして。
はじめてVBS書いてみたんですがうまく動かず、教えてもらいたいんですが。。。
LenB関数って、単純にLen関数の倍の値を返すだけなんですかね?
全角半角混交の文字列の長さを、半角1文字なら1、全角1文字なら2、として取得したいのに、Len("A")で1、LenB("A")で2、Len("A")で1、LenB("A")で2、となってしまって、ぜんぜん意味解りません。
》新米MCP さん 2005年 06月 21日 22時 28分 29秒
> こちらのサイトですが、左上にMCPのサイトへのリンクがありますよね。
> これって、どのようにすれば使用することができるのでしょうか。
MCPの「資格取得キャンペーン」の事でしょうか?
だとすればこれは、告知のご協力をお願いします、という事で、
MVP(≠MCP)な人に対して、事前にリンク依頼(≠義務)があったのです。
こんばんは。
ばんのしゃーによかばんた さん、ねばっていただきありがとうございます。
>ばんのしゃーによかばんた さん 2005年 06月 21日 16時 12分 12秒
>(a) 「Webから」でなく、ローカルのWSHからは呼び出せますか?
この辺をもうすこし詳しく教えていただけないでしょうか。
管理人さま、皆さま、はじめまして。
いつも勉強させていただいている者です。
ちょっとこのような質問をして良いものなのかどうか迷ったのですが、
もしよろしければ教えていただきたいことがあります。
こちらのサイトですが、左上にMCPのサイトへのリンクがありますよね。
これって、どのようにすれば使用することができるのでしょうか。
MCPロゴの使用ガイドラインなどを調べてみたのですが、
そこでは触れられておらず、検索などで調べようにも検索語が思いつきません。
WSHについての話題でなくてお叱りを受けてしまうかとも思ったのですが、
もしよろしければお教えいただけないでしょうか。
>けんじ さん 2005年 06月 16日 00時 36分 41秒
>現在、以下のscriptにて、ローカルのhtmlファイルを非表示で
>起動しているのですが、
>htmlファイルを開く時に、新たにiexploreプロセス起動→local.html起動(非表示)という流れにするにはどうすればよいのでしょうか?
>新たに、iexploreプロセスを起動したい理由は、すでに開いてあるIEがあった場合、そのIEとセッションを別にするためです。
「セッション」と言うのは、何のことでしょう?
プロセスが同じだと、どういう不都合があるのでしょう?
>けんじ さん 2005年 06月 18日 12時 46分 15秒
>Set WshShell=Wscript.CreateObject("Wscript.SHell")
>Wshshell.Run "iexplore.exe C:\local.html",0
>と記述すると、local.htmlは非表示で開けることはわかったのですが、
>この、非表示で開いたlocal.htmlの制御(閉じ方)の仕方をどなたか
非表示で開いて、そのまま閉じたのでは、何にもならないのでは?
中でスクリプトでも動かすつもりなら、中から終了するようにしないと
いけないのでは?
それなら、セキュリティゾーンのセキュリティレベルが関係するので、
HTAにしたほうがよいのではありませんか?
理由が分からないまま、兎に角、答えると、
一般的には、以下のようにすれば別プロセスになります。
Set ie=CreateObject("InternetExplorer.Application")
の一行の代わりに、以下のように、
Set wShell=CreateObject("WScript.Shell")
wShell.Run "IExplore.EXE -nohome",0
Set Shell=CreateObject("Shell.Application")
Do
WScript.Sleep 100
For Each ie In Shell.Windows()
If ie.Visible=False And ie.ToolBar<>False And ie.LocationURL="" Then
ie.ToolBar=False
Exit For
End If
Next
Loop While IsEmpty(ie)
と書けばよいでしょう。
また、別プロセスという言葉に反応して、
もし、PIDで操作するつもりなら、以下のほうがよいかも。
Set wShell=CreateObject("WScript.Shell")
Set oExec=wShell.Exec("C:\Program Files\Internet Explorer\IExplore.EXE -Embedding")
MsgBox oExec.ProcessID
Set Shell=CreateObject("Shell.Application")
Do
WScript.Sleep 100
For Each ie In Shell.Windows()
If ie.Visible=False And ie.ToolBar<>False And ie.LocationURL="" Then
ie.ToolBar=False
Exit For
End If
Next
Loop While IsEmpty(ie)
ただし、このIEは別プロセスになるものの、この後の
Set ie=CreateObject("InternetExplorer.Application")
は、また、このプロセスに同居しそうです。
※RunはApp Pathsを見るのに、Execは見ないのね。Buuu...h :-<
>管理人むたぐち さん 2005年 06月 19日 06時 15分 09秒
>ShellオブジェクトのWindowsメソッドで、現在開いているIEとフォルダのIEオブジェクトを返しますので、
>For Each IE In Shell.Windows
> If Typename(IE.document)="HTMLDocument" Then
> If InStr(Replace(IE.document.parentWindow.location.pathname,"%20"," ",sPath)<>0 THen
> IE.Quit
> MsgBox "閉じました"
> End If
> End If
>Next
この手のコードですが、
■TypeName(ie.Document)を見る前にie.ReadyState=4を確認すべし。
を原則にしましょう。
For Each ie In Shell.Windows
If ie.ReadyState=4 Then
If TypeName(ie.Document)="HTMLDocument" Then
If 何か条件 Then Exit For
End If
End If
Next
ほいでもって、新規に起こしたものを捕捉するには、待ち合わせが必要です。
Do
WScript.Sleep 100
For Each ie In Shell.Windows
If ie.ReadyState=4 Then
If TypeName(ie.Document)="HTMLDocument" Then
If 何か条件 Then Exit For
End If
End If
Next
Loop While IsEmpty(ie)
それから、Tip
>sPath="C:\local.html"
>If InStr(Replace(IE.document.parentWindow.location.pathname,"%20"," ",sPath)<>0 THen
なんか、苦労の跡が見えます。:-p
sPath="file://C:\local.html"
If ie.document.URLUnencoded=sPath THen
が、簡単でお勧めです。
また、一般に、document.parentWindowは、クロスドメインアクセスエラーで
参照できなかったりしますが、document.URLUnencodedは大丈夫なようです。
>ひで さん 2005年 06月 15日 21時 54分 42秒
>もし他にも確認したほうが良いポイントなどありましたら教えてください。
お手上げ気味ですが、もうちょっとだけ、じたばたしてみると。
>ひで さん 2005年 06月 01日 23時 08分 38秒
>以下のようなコードでWebから"print_sheet"マクロの実行を行っています。
(a) 「Webから」でなく、ローカルのWSHからは呼び出せますか?
(b) 名前を"printsheet"に変えてみる。
ありがとうございます。
さっそくためしてみます。
できたらまたご連絡します〜^^
To: 引越しや さん
フォルダの監視は、WMIのExecNotificationQueryメソッドを
使えば可能です。
http://www.roy.hi-ho.ne.jp/mutaguchi/bbs/list53.shtml
管理人むたぐち さん 2001年 12月 02日 10時 44分 19秒
の記事を参考にしてください。
実行すると大変なことになるとか、怖いことが書いてありますが、
WindowsXPの環境なら問題なく動作します。
LZHファイルの解凍は、外部ツールを用いる必要があると思います。
コマンドラインで動作するアーカイバユーティリティ、
もしくはActiveXコンポーネントであるコモンア−カイブOCX
(http://hp.vector.co.jp/authors/VA014162/work.htm)を使うと
良いでしょう。
もしくは、Microsoft 圧縮 (LZH 形式)
(http://www.microsoft.com/genuine/offers/)をインストールした上で、
http://www.roy.hi-ho.ne.jp/mutaguchi/bbs/list122.shtml
ばんのしゃーによかばんた さん 2004年 12月 14日 17時 59分 49秒 を
zipからlzhに書き直せば行けるかもしれません。
はじめまして。
初めてWSHに挑戦してるところです。
さっそくですが、以下のことをやろうと思うのですが可能でしょうか?
あるパソコンのフォルダを監視して、*.lzhのものを解凍してほかのパソコンの共有フォルダに送るという処理です。
いろいろなWSHのホームページみていたのですが、難しいですね^^;
IEのExecWB()を使って、いろいろ出来そうなものですが、
今までは、プロンプトが邪魔で、あまり使えませんでしたよね。
でも、例のテクを使えば、可能性がどーんと広がりそうです。
まずは手始めに、HTMファイルをShift JISに変更してみます。
htm2sjis.vbs
――――――――――――――――――――――――――――――――――――――
Option Explicit
Const OLECMDID_SAVEAS=4
Const OLECMDEXECOPT_PROMPTUSER=1 'Web ページの保存
Const OLECMDEXECOPT_DONTPROMPTUSER=2 'HTML ドキュメントの保存
Dim wShell
Dim ie
Dim arg
Set wShell=CreateObject("WScript.Shell")
Set ie=CreateObject("InternetExplorer.Application")
'ie.Visible=True
ie.Navigate2 "about:blank"
Do While ie.Busy Or ie.ReadyState<>4
WScript.Sleep 100
Loop
ie.Document.designMode="On"
For Each arg In WScript.Arguments
ie.Navigate2 arg
Do While ie.Busy Or ie.ReadyState<>4
WScript.Sleep 100
Loop
ie.Document.charset="csISO2022JP" 'SaveAs Only
wShell.Run "MSHTA.EXE vbscript:Execute(""msec=100:title=""""HTML ドキュメントの保存"""":Set wShell=CreateObject(""""WScript.Shell""""):Sub proc2():If wShell.AppActivate(title) Then:wShell.SendKeys """"%l{down}%s%y"""":setTimeout """"proc2"""",msec:Else:close():End If:End Sub:Sub proc1():If wShell.AppActivate(title) Then:proc2:Else:setTimeout """"proc1"""",msec:End If:End Sub:proc1:"")",0
ie.ExecWB OLECMDID_SAVEAS,OLECMDEXECOPT_DONTPROMPTUSER,arg
Next
ie.Quit
WScript.Quit
――――――――――――――――――――――――――――――――――――――
この方法のメリットは、
文字コードと<meta ... charset= >が一致すること、
非SJIS文字がNamed Entity(©)やNumeric Character Reference({)に
変換されることです。
>otnさん
お返事ありがとうございます。
(なぜかcmdウィンドウが閉じない、という不都合はありますが)
教えていただいたコードで実現できました。
大変ありがとうございました。
TO: 管理人むたぐち さん
ご返答ありがとうございます。
アドバイスどおりにしたら上手くいきました。
お世話になりました。
管理人により削除
●thinkpad汎用サーバー化計画
構成
・thinkpad(Celeron 600MHz,192MB,Windows Server 2003 Standard)
・librage(Athlon 64 3000+,1GB,Windows XP Pro)
・vaio_u(Crusoe TM5800 867MHz,256MB,Windows XP Home)
・inspiron(Pentium M 725,512MB,Windows XP Home)
仕事で使っているPCをthinkpadからデルのinspironに買い換えました。
そのためお下がりになったthinkpadを自宅用の汎用サーバーに仕立て上げることにしました。
(これまではlibrageですべてをこなしていたのです)
Server 2003を起動すると、「サーバーの役割」を設定するHTAが表示されるんですけど、
ここで設定してあるのは「ファイルサーバー」のみ(汗
ですがほかにSoftEtherを入れているのでVPNサーバー、AnHTTPDと04WebServerを入れている
のでWebサーバーとして稼動しています。
04WebServerは標準入力の扱いに注意すれば、cscript //nologoでVBSファイルを
CGIファイル化できます。(参考:管理人むたぐち さん 2005年 06月 03日 21時 13分 13秒とその前後)
私はこれでAdmin用のスクリプトをいっぱい書きました。テンプレート化・よく使う
コードをWSC化しておくとすぐ書けて便利です。
ダウンロードのページで公開中のWSHBBS(WSHch)にも使われています。
WSHchは現在、thinkpad上で稼動中ですのでご利用ください。
http://winscript.mine.nu/wshbbs/wsh/index.html
実際はばんのしゃーによかばんたさんのVBS2JS.vbsを使って.NETのコードに変換して
実行されています。詳しくは過去記事をどうぞ。
また、LibrageをWake on Lanに対応して、thinkpadからMagic Packetを送信することで
遠隔起動することも可能にしました。それもCGIで実行できます。
http://66.102.7.104/search?q=cache:VQF1wbJCrVEJ:blog.gwork.com/articles/sendmp.aspx+sendmp&hl=ja&lr=lang_ja&inlang=ja
さらに、Windows XPのshutdownコマンドをlibrage上のIISで実行中のCGIで動作させると、
電源を落とすこともできます。(shutdownコマンドをthinkpadで動作させなかった理由は、
たぶんワークグループ構成ではshutdownコマンドで他のPCの電源を落とせないためです。
もしかしたら権限を追加すれば何とかなるのかも)
これらはhttps+Basic認証で、一連の動作を暗号化した状態で実行できます。
携帯だといちいちpasswordを入れるのがめんどうなので、機種固有番号を送信させ、
自分のものなら認証するという形にしました。
機種固有番号を取得するには、DoCoMo端末ならこんな感じです。
serからはじまる11桁の数字です。
If Left(Env("HTTP_USER_AGENT"),10)="DoCoMo/1.0" Then
sUTN = Right(Env("HTTP_USER_AGENT"),14)
End If
# EnvはWshShell.Environment("Process") です。
このあとSHOUTCast Serverを入れてストリーミングサーバーにしようと考えています。
WinAMP COM(http://www.adcock8.freeserve.co.uk/winamp.htm)を使えばCGIでWinAMPを
操作できたりして面白いです。
To: けんじ さん
ShellオブジェクトのWindowsメソッドで、現在開いているIEとフォルダのIEオブジェクトを返しますので、そこからpathnameを調べ、合致するものをQuitすれば良いでしょう。
sPath="C:\local.html"
Set Shell =WSCript.CreateObject("Shell.Application")
For Each IE In Shell.Windows
If Typename(IE.document)="HTMLDocument" Then
If InStr(Replace(IE.document.parentWindow.location.pathname,"%20"," ",sPath)<>0 THen
IE.Quit
MsgBox "閉じました"
End If
End If
Next
すいません、追記します。
Set WshShell=Wscript.CreateObject("Wscript.SHell")
Wshshell.Run "iexplore.exe C:\local.html",0
と記述すると、local.htmlは非表示で開けることはわかったのですが、
この、非表示で開いたlocal.htmlの制御(閉じ方)の仕方をどなたか
教えていただけないでしょうか?
非表示で開いてるので、画面は見えず、タスクマネージャーのアプリケーションタブにも表示されませんが、プロセスとしては残ってしまっていますので。
管理人により削除
To: ななさん
ローカルのファイルに保存したいのですよね?
">" によるリダイレクトはCMD.EXEの機能なので、CMD.EXE経由で無いと効きません。
intErr = wshShell.Run("CMD /C C:\WINNT\system32\rsh.exe -n " & "サーバー名" & "-l [ユーザー名] pwd > D:/A/pwd.txt")
最初にお書きのスクリプトだと、リモートで "pwd > D:/A/pwd.txt" が実行されて、
リモートの "D:/A/pwd.txt" というファイルに書こうとしてエラーになっていると思われます。
自分の書き込みに追記します。
バッチファイルを作成して試してみました。
@echo off
%SystemRoot%\system32\rsh.exe [サーバー名] -l [ユーザ名] pwd > D:\Log\LogEdit.txt
EXIT
とすると結果を取得したテキストファイルが作成できました。
スクリプトの形式で実行するとrsh.exeは実行されるようで rshウインドウは開かれますが 何も動作していないようです。 ウィンドウだけ開かれるというのが気になります。
To ちゃっぴ さん 2005年 06月 16日 11時 57分 55秒
ご返答有難うございます。
> Remote Machine 上で Error が表示されるというのは、
> EventLog にでもあがるのでしょうかね?
イベントログには、システムに情報として出ておりました。
> だとすると、SWbemLocator & Process の Create 自体は
> 問題がないことになりますので、その EXE に問題があるのでしょう。
> # GUI Applicationじゃないの?
EXEはGUI Applicationです。
(詳しく書けなくて申し訳ございません。)
ローカルからEXEを起動させるスクリプト作成し、それをリモートから
実行すると上手く出来ました。
また、ローカルからEXEを起動させるスクリプトをWSHの
Runメソッドを使用することで、見た目バックグランドで
実行出来ているようです。
最終的な目標への目処が立ちそうです。
有難うございました。またよろしくお願い致します。
To ビッテンフェルト さん 2005年 06月 16日 10時 15分 17秒
> リモートマシン上でエラーが表示されてしまいます。
Remote Machine 上で Error が表示されるというのは、
EventLog にでもあがるのでしょうかね?
だとすると、SWbemLocator & Process の Create 自体は
問題がないことになりますので、その EXE に問題があるのでしょう。
# GUI Applicationじゃないの?
はじめまして、いつも参考にさせて頂いております。
リモートマシン上にあるexeファイルを実行したいのですが、
リモートマシン上でエラーが表示されてしまいます。
エラー内容
アプリケーションが正しく初期化されませんでした。(0xc0000142)
スクリプトは以下の通りです。
目標はリモートマシンのexeファイルを実行することです。
出来ればリモートマシンでバックグランドで実行できれば
最高です。
アドバイスの程宜しくお願い致します。
------------------------------------------------
NameSpace = "root\cimv2"
Set objSWbemLocator = CreateObject("WbemScripting.SWbemLocator")
Set objSWbemServices = objSWbemLocator.ConnectServer (RemoteMachine, NameSpace, RemoteUser, RemotePass)
Set RemoteCom = objSWbemServices.get("Win32_Process")
CMD = "c:\test.exe"
Res = RemoteCom.create("cmd.exe /c " & CMD)
はじめまして いつもお世話になっています。
rsh.exeを使用してリモートホストに対する処理を実行したいのですが、以下のコマンドでテキストが生成されず、理由が分からず困っています。
どのようにすればいいのか、ご存知でしたら教えて下さい。お願いします。
set wshShell = WScript.CreateObject("WScript.Shell")
intErr = wshShell.Run("C:\WINNT\system32\rsh.exe " & "サーバー名" & "-l [ユーザー名] pwd > D:/A/pwd.txt")
管理人により削除
はじめまして、
よろしければ何かご助言でもいただけないかと思いまして、
質問させていただきます。
現在、以下のscriptにて、ローカルのhtmlファイルを非表示で
起動しているのですが、
htmlファイルを開く時に、新たにiexploreプロセス起動→local.html起動(非表示)という流れにするにはどうすればよいのでしょうか?
新たに、iexploreプロセスを起動したい理由は、すでに開いてあるIEがあった場合、そのIEとセッションを別にするためです。
set ie = WScript.CreateObject("InternetExplorer.Application")
ie.visble = false
ie.Navigate2("C:\local.html")
Do While ie.busy
Loop
ie.quit
下のscriptだと、プロセス起動→local.html起動となるのですが、
local.htmlを非表示にするやり方がわかりません。
Set WshShell=Wscript.CreateObject("Wscript.SHell")
Wshshell.Run("iexplore.exe C:\local.html")
よろしければ、ご教授お願いします
管理人むたぐち さん、ばんのしゃーによかばんた さん
まだ解決はしていませんが、コメントをいただきありがとうございます。
以下確認結果のご報告です。
○管理人むたぐち さん
6/2 14:32 にコメントいただいたのに
時間が空いてしまってすみません。
wscript.exeのバージョンに違いはありました。
(ただマイナーバージョンレベルの違いでした)
正しく動く環境:5.6.0.8515
上手く動かない環境:5.6.0.6626
vbscript.dllのバージョンは同じでした
両環境とも 5.6.0.7426
================================================
○ばんのしゃーによかばんた さん
6/3 15:27 にコードレベルでアドバイスいただいたのに
返信が遅くなってしまいすみませんでした。
さっそくマクロ呼び出し部分のスクリプトを変更してみました。
' Excelテンプレート起動
'objExcel.Workbooks.Open(excelPath)
'------------------------------------ 変更点
Set book = objExcel.Workbooks.Open(excelPath)
'------------------------------------ 変更点
' 印刷マクロを実行する
'Call objExcel.Run("print_sheet", Cstr(xmlPath), Cstr(previewFlg), Cstr(btnName))
'------------------------------------ 変更点
Call objExcel.Run(book.Name & "!XMLModule.print_sheet", Cstr(xmlPath), Cstr(previewFlg), Cstr(btnName))
'------------------------------------ 変更点
しかし相変わらずある特定の環境のみ、VBScriptエラー(黄色い三角のびっくりマーク)
「マクロ'print_sheet'が見つかりません」が発生してしまいます。
「マクロ'print_sheet'が見つかりません」のエラーが発生したあとに、
そのファイルをlocalに保存しマクロを確認すると「print_sheet」関数はあります。
もし他にも確認したほうが良いポイントなどありましたら教えてください。
■「名前を付けて保存」ダイアログの活用法。
■IEの「ソースの表示」の「メモ帳」で、文字化けや、バイナリだったらどうするか?
大概、「ソースの表示」を諦めるでしょう。
しかし、諦めるのはまだ早い。
「メモ帳」の「名前を付けて保存」を開く。そこで、FileNameが分かる。それをコピー。
「名前を付けて保存」をCacheフォルダに移動する。それにはちょっとコツが必要。
Local Settingsへ行っても、Temporary Internet Filesがない。
ファイル名に*を入れると表示される。Temporary Internet Filesを選択して、
ファイル名にTemporary Internet Files\*を入れると一覧が表示される。
ファイル名に先ほどのFileNameを入れて、ここでも、ワイルドカードを使って、
FileName*
のようにすると、一覧にそのファイルが表示される。
後は、右クリックで好きなようにしてください。
ところで、この振る舞いは,ShellFolderViewっぽいですね。
ワイルドカードはFolderItems.Filter()を使ってる?
HTA/スクリプトで同じようなものが作れるってことでしょうか?
逆の発想で、「ファイルを開く」ダイアログをエクスプローラ代わりに使う、
というのはどうでしょう?
エクスプローラでは、ファイル一覧をワイルドカードで絞り込むことなんか、
出来ません(※)が、「ファイルを開く」ダイアログなら出来ます。
これを、ワイルドカード絞り込み機能付きエクスプローラとして使うのです。
※「ファイルの検索」の「検索結果」ではフォルダの移動などができない。