こんばんは
ここのサイトのWSHテクニック集に、コントロールパネルを直接開く方法
が記載されており、それに習ってネットワークを開こうとしております。
その3枚目のタブが開かせようとしていますが、上手くいきません。
何か方法があるのでしょうか?
Set WSHShell = WScript.CreateObject("WScript.Shell")
WSHShell.Run "control.exe Netcpl.cpl ,2"
尚、事例のシステムのプロパティはOKでした。
'「システムのプロパティ」の「デバイスマネージャ」タブを開く。指定する数値はタブの順番-1
Set WSHShell = WScript.CreateObject("WScript.Shell")
WSHShell.Run "control.exe sysdm.cpl ,1"
》せい さん 2005年 07月 02日 23時 38分 23秒
> 2.同名の関数を複数定義すると最後に定義した関数を
> 有効にするってのも仕様なんだろうなぁ。強力バグ元
う〜ん。確かにエラーになって欲しい所ですね。これは。
で。この点に関しては、クラスを利用する事である程度回避できると思います。
たとえば、
Class Sample
Function F(a, b)
End Function
Function F(a)
End Function
End Class
のように記述すれば、F(a)が 二重定義エラーとして処理されるようになります。
呼び出し手順が面倒になるので、すべての場面で利用可能というわけにはいきませんが、
エンティティの名前のスコープが明示できるので、バグ回避の役には立つでしょう。
> 1.ステートメントとわ関数なんだろかい。
VB系言語における「メソッド(やプロパティ等)」とは、本来は、特定のCOMクラスのメンバとして
実装されている物の事を指しています。「関数」は、値を返すメソッドの意味で使われます。
そして、それ以外の物――メソッドの呼び出しとて実装されているわけではなく、
VBScript独自の文法構文となっている物――が「ステートメント」として呼ばれています。
たとえば、For, With, While などは ステートメント であり、これらが 関数 や メソッド と
呼ばれる事はありません。そうした面から、両者は本来、異なる物なのでしょう。
しかし、歴史的な経緯などから、『グローバルなオブジェクト』のメソッドについては、
あえてメソッドとは呼ばず、ステートメント や 関数 と呼ばれている例は少なからずあります。
今回の例に出た『Execute』という名前もその一つで、VBSの ヘルプ上では Statement に分類されて
いますが、これは実際には、GlobalObj というディスパッチインターフェイスのメソッドとして
実装されています。(ExecuteGlobal も同様で、実際には GlobalObj 上のメソッドです)
一方、ADODB.Connection や Scripting.RegExp といったクラスにも、同名の『Execute』のメソッド名が
ありますが、こちらは「ステートメント」と呼ばれる事は無く、あくまで「メソッド」として
呼ばれるのが一般的です。
どちらの Execute も、COM のメソッドであるにも関わらず、一方は ステートメントとして呼ばれ、
他方はメソッドとして呼ばれているわけですが、これは、初期のVBやそれ以前のBASIC言語において、
値を返す処理=関数、値を返さない処理=ステートメント と呼んでいたという、歴史的な経緯に
よるところが大きいと思われます。特に、グローバルオブジェクトが有するメソッドについては、
それらがメソッドではなく、関数やステートメントという名で呼ばれていたりするようです。
> これ、RegExpクラスにExecuteメソッドがあるから絶対
> 予約語に出来ないはずなんですよね。
特定のクラスのメソッドとして実装されているという事と、それを予約語にできるかどうかとは、
あまり関係ないかも知れませんよ。
『あるクラスのメソッド名』として定義済みであったとしても、グローバルまたは別のクラスの
メソッド名として、同じ名前を使う事はできますしね。
『ステートメント名』に関しては、基本的に予約語になっていますので、メソッド名として
利用する事はできませんが、その名前を [ ] で囲む事で、ある程度は利用可能になります。
http://msdn.microsoft.com/library/en-us/script56/html/vserrexpectedidentifier.asp
問題は、その予約語の一覧が見当たらないという事ですかね。(泣)
JScript, JScript.NET, Visual Basic.NET の予約語は公開されているのに……。
音の切れ目が必要なようです。音階の設定は出鱈目です。
sheep.vbs
――――――――――――――――――――――――――――――――――――――
Set BeepWin32=CreateObject("Beep.Win32")
Sub Beep(Frequency,Duration)
BeepWin32.Beep Frequency,Duration
WScript.Sleep 100
End Sub
Beep 2000, 500
Beep 1000, 100
Beep 500, 300
Beep 1000, 300
Beep 2000, 300
Beep 2000, 300
Beep 2000, 700
Beep 1000, 300
Beep 1000, 300
Beep 1000, 700
流石に今回はMicrosoft様に笑わさせていただきました。
1.ステートメントとわ関数なんだろかい。
Call Execute("msgbox ""execute""")
Call ExecuteGlobal("msgbox ""executeglobal""")
調べた限りでは他のステートメント名はメソッド(関数)名に
使えません。
これ、RegExpクラスにExecuteメソッドがあるから絶対
予約語に出来ないはずなんですよね。今まで気づかなかった
のは迂闊としか言いようが無い。
2.同名の関数を複数定義すると最後に定義した関数を
有効にするってのも仕様なんだろうなぁ。強力バグ元
'vvv f1.vbs
Function f(a,b)
MsgBox "f(a,b)"
End Function
Function f(a)
MsgBox "f(a)"
End Function
f 0
f 0,1 ' error
'^^^
'vvv f2.vbs
Function f(a)
MsgBox "f(a)"
End Function
Function f(a,b)
MsgBox "f(a,b)"
End Function
f 0,1
f 0 'error
'^^^
To: WSH初心者 さん
こちらの環境(Win XP + Windows Script 5.6)では、
CopyHereメソッドを使えばダイアログが表示されました。
ただし、ファイルが少ない場合は表示されません。
これはエクスプローラと同様の動作です。
そちらの環境を教えてください。
はじまして、WSH初心者です。初めて質問させていただきます。
WSHにて、フォルダのコピーのスクリプトを作成しているのですが、
コピーの進行状況が表示されず困っています。
過去の掲示板を見ると、Shell.Applicationを利用すると、コピーの際
進行状況が表示される。と記載されていましたので、行ってみましたが
何も表示されません。
WSHのバージョンも上がっていますので、昔とやり方が変わったのでしょうか?
ご存知の方いらっしゃいましたら、教えてください。
(Web検索を行っても、本掲示板の情報しか見つけられませんでした・・・)
ご助言お願いします。
VB.NETでちょこちょこっと作ってみました。
今度はWin32APIのBeep()です。
BeepWin32.VB
――――――――――――――――――――――――――――――――――――――
Imports Microsoft.VisualBasic
Imports System.Runtime.InteropServices
Namespace Beep
Public Class Win32
Private Declare Function xBeep Lib "Kernel32" Alias "Beep" (ByVal dwFreq As Integer, ByVal dwDuration As Integer) As Integer
Public Function Beep (ByVal dwFreq As Integer, ByVal dwDuration As Integer) As Integer
Beep=xBeep(dwFreq, dwDuration)
End Function
Public Function GetError() As Object
GetError = Err
End Function
End Class 'Win32
End NameSpace 'Beep
――――――――――――――――――――――――――――――――――――――
vbc /t:library BeepWin32.VB
C:\Windows\System32にコピーして、
regasm BeepWin32.DLL
Beep.VBS
――――――――――――――――――――――――――――――――――――――
Option Explicit
Dim BeepWin32
Dim Freq
Dim Duration
Dim RC
Set BeepWin32=CreateObject("Beep.Win32")
'msgbox typename(BeepWin32)
If WScript.Arguments.Length=2 Then
Freq=WScript.Arguments(0)
Duration=WScript.Arguments(1)
ElseIf WScript.Arguments.Length=0 Then
Freq=800
Duration=200
Else
WScript.Echo "Usage: Beep Freq Duration"
WScript.Quit 1
End If
RC=BeepWin32.Beep(Freq, Duration)
If RC=0 Then
Set Error=BeepWin32.GetError
WScript.Echo " Source: " & Error.Source & " Number: " & Error.Number & " " & Error.Description & " DLL Error: " & Error.LastDLLError
WScript.Quit 2
Else
' WScript.Echo RC
WScript.Quit 0
End If
――――――――――――――――――――――――――――――――――――――
どなたか、Beep音で着メロみたいなの作りません?
VB.NETでちょこちょこっと作ってみました。
クリップボードと日本語が通るSendKeys。
Clipboard.VB
――――――――――――――――――――――――――――――――――――――
Namespace Clipboard
Public Class Clipboard
Public Function GetText() As String
Dim Text As String
If System.Windows.Forms.Clipboard.GetDataObject.GetDataPresent( _
System.Windows.Forms.DataFormats.Text) Then
Text=System.Windows.Forms.Clipboard.GetDataObject.GetData( _
System.Windows.Forms.DataFormats.Text)
End If
Return Text
End Function
Public Sub SetText(ByVal Text As String)
Dim oDataObject As New System.Windows.Forms.DataObject
oDataObject.SetData(System.Windows.Forms.DataFormats.Text,Text)
System.Windows.Forms.Clipboard.SetDataObject(oDataObject,True)
End Sub
Public Sub SendKeys(ByVal Text As String)
If Text<>"" Then
System.Windows.Forms.SendKeys.SendWait(Text)
End If
End Sub
End Class 'Clipboard
End NameSpace 'Clipboard
――――――――――――――――――――――――――――――――――――――
vbcr.cmd
――――――――――――――――――――――――――――――――――――――
vbc.exe /r:System.dll,System.Windows.Forms.dll,System.Drawing.dll %*
――――――――――――――――――――――――――――――――――――――
vbcr /t:library Clipboard.VB
C:\Windows\System32にコピーして、
regasm Clipboard.DLL
Test.VBS
――――――――――――――――――――――――――――――――――――――
CreateObject("Clipboard.Clipboard").SetText "aaaa"
MsgBox CreateObject("Clipboard.Clipboard").GetText
Set wShell=CreateObject("WScript.Shell")
If wShell.AppActivate("メモ帳") Then
wShell.SendKeys "あいうえお"
CreateObject("Clipboard.Clipboard").SendKeys "あいうえお"
End If
――――――――――――――――――――――――――――――――――――――
※""やEmptyをSetDataしたのとは違って、
clipboardData.clearData相当はどうすればよいのでしょう?
IEの印刷待ち合わせの別案です。
ie.ExecWB OLECMDID_PRINT,OLECMDEXECOPT_PROMPTUSER
Do While Not wShell.AppActivate("印刷")
WScript.Sleep 100
Loop
wShell.SendKeys "%p"
わざと印刷ダイアログを表示させて、それを待ち合わせます。
そこまで待てば、後はいいみたいです。
>ばんのしゃーによかばんた さん 2005年 06月 28日 19時 28分 24秒
>OS名をVersionから変換するのではなく、文字列で直接求めるなら、
>こんな方法も。
OSNameで検索すると、Win32_Processぐらいしか出て来なかったのですが、
Win32_OperatingSystemなんて云う、そのものがありましたね。
For Each OS In GetObject("winmgmts:").ExecQuery("Select * From Win32_OperatingSystem")
MsgBox OS.Caption&vbLf&FormatNumber(OS.TotalVisibleMemorySize ,0) & " bytes"
Next
「ダウンロード」に「シンプルなバックアップスクリプト」を
追加しました。
これは私が1年以上使っているスクリプトを
一般公開用に書き直したもので、私にとっては
必要かつ十分なスクリプトです。
もし良かったら使ってみてください。
管理人むたぐちです。
2005年7月〜2006年6月のMSMVP for Visual Developer - Scriptingに再認定されましたので、ここでご報告させていただきます。
この1年間も、よろしくお願いいたします。
すみません、また躓いてしまいましたorz
テスト機での検証後、本番環境へ導入しようとしたのですが、
本番環境のモデム(Dialupルータ)はコンソールケーブルで接続されておらず
イーサネット接続しかされていません。そのため、サーバー側からデバイス
として認識されず、イーサネットの向こうのモデムをrasdialで制御できません。なぜ自動ダイアルアップさせたいのかと言いますと、A地点とB地点の
それぞれのプライベートネットワークをrasdialでコネクションを張って
1つのLANを作り、ファイルの交換をやりたいのです。
WHS自体の質問からは若干離れているような気もしますが、ご助言願えないでしょうか?
失礼しました、先ほどrasdialできない件で投稿したものですが、
問題ありません。いろいろいじってる間に解決しました。
どうやらオプションが不足していたようです。
dup.Run("rasdial socs001 socs001 11111", 1, True)
これでうまくいきました。ありがとうございます。
》管理人むたぐち さん 2005年 06月 29日 15時 38分 30秒
まぁ……やろうと思えば一応可能なんですけどね。
IIS 5.x の場合は、IISADMIN サービスと W3SVC サービスが、
「デスクトップとの対話を許可」に設定されており、かつ、
IISのアプリケーション保護レベルが「IISプロセス」に設定されていて、
さらに、IISの実行アカウントが、処理対象のexeへの実行アクセス権を
有しているならば、ASP上から起動したアプリも表示されます。
ただ、安全面からお奨めできる設定ではありませんので、
私の回答としては、やはり、
> (ウィンドウを表示させるようなアプリ)は使えない、と思った方が良いかと。
という方向で。(^_^;)
AirH"を使い、rasdialコマンドを利用してダイアルアップルーターへ
接続しようとしています。
DOS窓から、
rasdial 接続名 ユーザー名 パスワード
を実行し、接続が確立すること(AirH"がアクティブになり発信→ルータ着信)を確認しましたが、スクリプトに
Set dup = CreateObject("Wscript.Shell")
dup.Run "cmd.exe /k rasdial 接続名 ユーザー名 パスワード"
を組んで動作確認したところ、AirH"が反応してくれません。
OSはWinodwsXP、ダイアルアップルータはNTT-MEです。
WSHで動かないDOSコマンドってあるでしょうか・・・?
To: 魔界の仮面弁士 さん
IISはちょっとわかりませんが、04WebServerだと、コントロール
パネルの「サービス」で「デスクトップとの対話を許可」に
チェックを入れると、表示されるようになります。
》熊太郎 さん 2005年 06月 29日 09時 39分 05秒
> 画面にNotepadが起動されません。これは、こういうものなのでしょうか?
そういうものです。
サービスが利用するデスクトップと、管理者等が見ているデスクトップは別なので、
IIS上で実行したアプリが、管理者が見ている画面上に表示される事は無いと思います。
そもそも、「画面」が無い状態――管理者も含め、誰もサーバーにログオンして
いない状況――であっても、IISは実行されますしね。
逆に、複数のデスクトップ画面があった場合――その Windows Server に対して、
同時に複数のユーザーがログオンしていた場合――――でも、IISは稼動します。
ですから、IISから実行させる場合、デスクトップとの対話を必要とするもの
(ウィンドウを表示させるようなアプリ)は使えない、と思った方が良いかと。
ASPでの外部プログラムの実行について
初心者ですいません。このサイトでもしばしば見かける次のASPファイル
をブラウザより実行すると、タスクマネージャーのプロセス一覧には、表示
されるのですが、アプリケ−ションの一覧には、表示されず、IISのサーバ
画面にNotepadが起動されません。これは、こういうものなのでしょうか?
それとも方法によっては、起動させることができるのでしょうか?
どなたか、お教えください。よろしく、お願いいたします。
<%
Set objShell = Server.CreateObject ("WScript.Shell")
objShell.Run "Notepad.exe", 1, False
Set objShell = Nothing
%>
>管理人むたぐち さん 2005年 06月 27日 18時 10分 29秒
>To: まどく さん
>> そのFortranのプログラムは、途中にPauseをかけてあります。
>> そのPauseしたのを認識して、WSHの次のコマンドラインに移る方法ってありますか?
>Fortran側で0バイトのファイルを作成し、WSH側からは
>そのファイルが生成されるのを監視すればいいのではないでしょうか。
FORTRANにファイルを作成する機能ってありましたっけ?
無ければ、FORTRANにOPEN/CLOSEって有りましたっけ?
有れば特定ファイルの中身を書き換えて、それを監視する、ですね。
もし、FT06F00?とか、が標準出力に流せるのであれば、パイプで受けて、
FORTRAN側がPAUSEの前に1行書き出す。受け側のVBScriptが標準入力で待つ。
というのは、どうでしょう。
パイプがフルバッファリングになって駄目かも。
FORTRANにflushとかT-CLOSEみたいなのってありましたっけ?
あるいは、バッファサイズで書き出せばよいかも。
そもそも、PAUSEはメッセージを出すのでは?
もし、そうなら、"WScript.Shell"のAppActivateで監視する。
>>この方法だと検索にメモリーを取られてしまうので、あまり実用的ではありません。
この意味が分かりません。
FORTRAN側にシェル起動機能でもない限り、いずれの方法にせよ、
監視するのに、メモリが取られますけど。。。
追加書きでファイルが巨大になって検索にメモリが取られる?
どの辺が実用的でないのでしょう?
監視ループで
WScript.Sleep 1000
とかしないで、CPUループしてるのではありませんか?
OS名をVersionから変換するのではなく、文字列で直接求めるなら、
こんな方法も。
OSName.VBS
――――――――――――――――――――――――――――――――――――――
For Each oProcess In GetObject("winmgmts:").InstancesOf("Win32_Process")
WScript.Echo Replace(oProcess.OSName,"|",vbLf)
Exit For
Next
――――――――――――――――――――――――――――――――――――――
'Microsoft Windows XP Home Edition|C:\WINDOWS|\Device\Harddisk0\Partition1
'Microsoft Windows XP Home Edition
'C:\WINDOWS
'\Device\Harddisk0\Partition1
OSVer.VBS
――――――――――――――――――――――――――――――――――――――
Set wShell=CreateObject("WScript.Shell")
Set oExec=wShell.Exec("%COMSPEC% /CVER")
WScript.Echo oExec.StdOut.ReadAll
――――――――――――――――――――――――――――――――――――――
>管理人むたぐち さん 2005年 06月 28日 13時 35分 25秒
> Select Case sVer
> Case "4.10.2222" : GetOSName = "Windows 98SE"
> Case "4.90.0.3000" : GetOSName = "Windows ME"
> Case "5.0.2191.1" : GetOSName = "Windows 2000"
> Case "5.1.2600.2180" : GetOSName = "Windows XP"
> Case "5.2.3790.0" : GetOSName = "Windows Server 2003"
> Case Else : GetOSName = sVer
> End Select
こういうCaseでは、To構文が使えるとよいのにね。
そこで、Select CaseのTo構文の代替方法です。
Select Case x
Case 1
Case 2 To 5
Case Else
End Select
なら、
Select Case True
Case x=1
Case 2<=x And x<=5
Case Else
End Select
とします。Ifなんかで代替するよりは、まだ、ましと思いません?
※この構文は「土屋式To構文」と呼びましょう。:-p
先のCaseは、こんな感じです。
Select Case True
Case "4.10"<=sVer And sVer<"4.90" GetOSName="Windows 98SE"
Case "4.90"<=sVer And sVer<"5.0" GetOSName="Windows ME"
Case "5.0"<=sVer And sVer<"5.1" GetOSName="Windows 2000"
Case "5.1"<=sVer And sVer<"5.2" GetOSName="Windows XP"
Case "5.2"<=sVer GetOSName="Windows Server 2003"
Case Else GetOSName=sVer
End Select
文字列の桁が違いましたね。
桁を合わせると、ADODB.Streamで、
---------------------------
10000000
0.2578125
---------------------------
20000000
0.5078125
---------------------------
となって、APIや.NETには、とても敵いませんが、
Windows標準環境で最速とか、手間で正規化(性能/手間)して最速とか、
負け惜しみを言ってみる。
ところで、負けたからと言って、モデルを変えるようで、なんですが、
も少し現実的な(有利な?)モデルに変更すると。
StartTime=Timer
L=0
For k=1 To 10000
L=L+LenA(String(100,"a"))
Next
MsgBox L&vbLf&(Timer-StartTime)
StartTime=Timer
L=0
For k=1 To 10000
L=L+LenA(String(100,"あ"))
Next
MsgBox L&vbLf&(Timer-StartTime)
LenA
---------------------------
1000000
1.4375
---------------------------
2000000
2.039063
---------------------------
は、あまり変わりませんが、
ADODB.Streamは、
---------------------------
1000000
2.085938
---------------------------
2000000
2.828125
---------------------------
LenAより遅い。やはり、オブジェクト呼び出しは重いんですね。
なので、現実的には、LenAが最速。とか、主張してみる。
>つちや さん 2005年 06月 26日 21時 26分 40秒
>HomeEditionで使えましたが、ライセンスがよくわからないので、私の場合は自作のCOMでパスワードダイアログを作成して使ってます。ファイルを開くコモンダイアログボックスや、クリップボードの読み書きもCOM使ってます。
話が逸れますが、
そのCOMって、PDFからテキストが抽出できるって云う物でしょうか?
それって、どうやるんでしょう? タイトルも取り出せます?
AcrobatのCOMを使えば簡単ですが、自力でPDFのタイトルを取り出そうとして、
えらく苦労したことがあるもんで、興味があります。
>なるべくWindows標準で工夫するのが粋だとは思いますが、個人で使う分には自作COMでかまわないし、その方がずっと速いのもので。といおうか、スクリプトの記述がすごく簡単になるので、それが大きいかも。
確かに従来は、そうでしたが、今となっては、むたぐちさんのSjisString.jsのように、
.NETでちょろちょろっと作るのほうが、広範な環境で使えてよいのでは?
ところで、こういうのはなんて呼ぶんでしょう?
COMコンポーネントのように使えるけれど、、、
>実は文字列のバイト数を求めるのもCOMで作ってたりします。
>もしも誰かご要望があれば、Delphi2005でコンパイルしなおしたものを公開しましょうか。
というより、この際、.NETに作り直しませんか?
そうすれば、今回みたいな催しに即、参戦できますよ。
>Delphi製なので、ダイアログなどを含むと、てきめんにサイズが大きくなりますが。
.NETならサイズも小さいし。
すみません。
追記させてください。
現在のユーザは管理者権限がありません。
・・・ひょっとして、それのせいでしょうか?
TO BUNさん
バッチ流し終わった後はOSの再起動をかけております。
TO 管理人むたぐちさん
OSを書くのを忘れてしまいました。
OSはWin2000です。
リンク先が変更されますか。。
Set WshShell=WScript.CreateObject("WScript.Shell")
WshShell.RegWrite "HKEY_CURRENT_USER\Software\Microsoft\
Windows\CurrentVersion\Explorer\
Shell Folders\Personal","U:\", "REG_SZ"
WshShell.RegWrite "HKEY_CURRENT_USER\Software\Microsoft\
Windows\CurrentVersion\Explorer\
User Shell Folders\Personal","U:\", "REG_SZ"
SET WshShell = nothing
上記コードなのですが、
何かまずいのでしょうか?
#すみません。
ソースを乗せてしまいました。
検証もしていないので、申し訳ないのですが、
バッチ終了後に、OSをリブートしても変更されていませんか?
To: かば さん
OSは何でしょうか?
とりあえずWindows 2000で確認したところ、ログオフ後に
リンク先が変更されるようです。
はじめまして。
現在、マイドキュメントのリンク先を変更するバッチを作成しております。
デフォルトでC:\Documents and Settings\ユーザID\My Documents
となっているものを
regwrite文を使用してU:\というネットワーク接続されているドライブにリンク先を
変更しようとしております。
#対象のレジストリは
・HKEY_CURRENT_USERSoftware\
Microsoft\Windows\CurrentVersion\Explorer\
Shell Folders\Personal
・HKEY_CURRENT_USERSoftware\
Microsoft\Windows\CurrentVersion\Explorer\
USER Shell Folders\Personal
の2箇所です。
バッチを流し終えてレジストリエディタで上記2箇所を参照すると「U:\」に変更
されます。そして、再起動をかけますと、レジストリエディタ上は「U:\」に
なっているのですが、デスクトップ上のマイドキュメントの内容及びリンク先は
C:\Documents and Settings\ユーザID\My Documentsのままなのです。
何か変更するものが足りないのでしょうか?
ご存知でしたら、ご教授いただけると幸いです。
よろしくお願いいたします。
To: 管理人たむぐちさん
Left関数、IF文で何とかできました。
有難うございます。
少々、インチキ臭い判定の仕方ですが、
今回の件の使用には、耐えそうです。
Win98のクライアントは、さっさと移行してしまいたいものです。
To: BUN さん
Left関数、CDbl関数、If...Then...Elseステートメントを使えば可能です。
詳しくはWindows Script 5.6のヘルプをどうぞ。
To: 管理人たむぐちさん
kernel32.dllのバージョンが、
同じOSでも複数ある様なので、
先に教えていただいた、Caseの部分を修正していたのですが、
中々思うようにいきません。
sVerでの文字列を、頭3桁だけ取り、
不等式で判定をしようと考えています。
思惑
a=sVer(頭3桁)
Case a<4.9: GetOSName = "Windows 98SE"
Case a<5.0: GetOSName = "Windows ME"
このような感じをイメージしています。
何か、良い方法はありませんでしょうか?
度々の質問に、失礼致します。
To: 管理人たむぐちさん
早いレス、有難うございます。
早速、Case等の部分を修正して使用してみました。
スムーズに動いています。
とても、助かりました。 ^^
新規に導入するアプリの為、
クライアントPCの環境を調べている最中だったのです。
(台数が、1000台を越す割には、環境資料がないのです)
メモリの表示が、Win98で出来ないのは残念ですが、
元々Win98→WinXpに、移行するための台数調査が、
メインなので、なんとかなりそうです。
こちらのHPは、しばらく病み付きのように、見てそうです。
WSHって、こんなにも使える物だったのか〜
To: BUN さん
以下のようなスクリプトでどうでしょうか。
OSのバージョンはkernel32.dllのバージョンで判別できます。
ただし、素のWin98SEに含まれるFileSystemObjectには
GetFileVersionメソッドがありませんので、別途Windows Script 5.6か
IE5.5以上をインストールする必要があります。
メモリーに関しては、WMIを用いて取得できます。ただしこれもWin98SE
では動作しません。
以下のスクリプトはWindows ME/2000/XP/Server 2003で動作確認しました。
# Microsoft Virtual PCはこういう時便利ですね。
msgbox GetOSName
msgbox GetTotalPhysicalMemory
Function GetOSName()
Const SystemFolder = 1
Set Fs = WScript.CreateObject("Scripting.FileSystemObject")
sVer = Fs.GetFileVersion(Fs.BuildPath(Fs.GetSpecialfolder _
(SystemFolder).Path,"kernel32.dll"))
Select Case sVer
Case "4.10.2222" : GetOSName = "Windows 98SE"
Case "4.90.0.3000" : GetOSName = "Windows ME"
Case "5.0.2191.1" : GetOSName = "Windows 2000"
Case "5.1.2600.2180" : GetOSName = "Windows XP"
Case "5.2.3790.0" : GetOSName = "Windows Server 2003"
Case Else : GetOSName = sVer
End Select
End Function
Function GetTotalPhysicalMemory()
For Each Cs In GetObject("winmgmts:").ExecQuery("Select * From Win32_ComputerSystem")
GetTotalPhysicalMemory = FormatNumber(Cs.TotalPhysicalMemory,0) & " bytes"
Next
End Function
TO:管理人むたぐち さん
> ファイアウォールがパケットをブロックしてませんか?
> とくにWindows XP SP2のWindowsファイアウォールに注意です。
> あとはDCOMの構成は正しいですか?
→FWは無効ですし、DCOM構成もデフォルトのままなのですが。。。
ただ、別のマシンで行ったところ問題なく取得できました。
プログラムが問題ではないことが確認できて良かったです。
有難うございました。
下の投稿の追伸です。
調査したいPCのOSの種類は、Win98、WinMe、Win2K、WinXp です。
実装している物理メモリは、
こちらのHPにあった、GetSystemInformation で解る見たいんですが、
あいにくOSの条件があるらしくて、無理っぽいです。
会社資産のPCの環境を整理しているのですが、
台数が多いので、WSHで上手くいかないかと思案しています。
必要な環境情報が
Cドライブの空き容量
実装メモリ
OSの種類
この内、ドライブの空き容量は、
Driveオブジェクトから分ったのですが、
実装メモリとOSの種類がの取得方法がわかりません。
識者のかた、ご教授くださいませ。
WSHやらVBS等、初めて触る物で、
こちらのHPを参考にしながら、勉強しております。(昨日から)
このHPは、分りやすくて助かります。
To: なな さん
> 他端末の共有フォルダをネットワークドライブ接続したいのですが、どうしてもダイアログボックスが表示され、パスパスワードの入力が要求されます。 どなたか、パスワードを入力しなくても良い方法をご存知ないでしょうか。
Set WSHNetwork = WScript.Createobject("WScript.Network")
WSHNetwork.MapNetworkdrive "ドライブ名" , "共有名" , "プロファイルの更新フラグ{False , True}" , "UserName" , "UserPass"
でいけるとおもいます。
色々なLenがあって皆さんのを試してみたのですが
どうもLenNETは私の環境では登録できないようです。
(無理矢理Win98にSDKをいれたのが原因だと思う)
私のところではなぜかLenDWが最速でした。
COMや.NETは最新の環境に最適化しているようです。
LenAをそのままvbcでコンパイルするとマルチバイト
コードのほうがかなり遅い結果になりました。型指定や
最適化オプションをつけてもだめです。ライブラリが
足を引張っているようです。
結果だけ
LenDW
---------------------------
1000000
0.2202148
---------------------------
2000000
0.2197266
---------------------------
ADO版LenA
---------------------------
1000000
0.6103516
---------------------------
2000000
0.5498047
---------------------------
コンパイル版LenA
---------------------------
1000000
0.550000000000182
---------------------------
2000000
2.30999999999949
---------------------------
To: まどく さん
> そのFortranのプログラムは、途中にPauseをかけてあります。
> そのPauseしたのを認識して、WSHの次のコマンドラインに移る方法ってありますか?
Fortran側で0バイトのファイルを作成し、WSH側からは
そのファイルが生成されるのを監視すればいいのではないでしょうか。
Set WshShell = WScript.CreateObject("WScript.Shell")
Set Fs = WScript.CreateObject("Scripting.FileSystemObject")
WshShell.Run "Fortranのプログラム起動",1,False
Do
WScript.Sleep 100
If Fs.FileExists("file.tmp") Then
Fs.DeleteFile "file.tmp"
Exit Do
End If
Loop
...
To: 可哀想なカムラン さん
> リモートマシン上のあるプロセスを取得したいのですが、
> 上手くできません。
> (何かを取得しているようなのですが、nullです。)
ファイアウォールがパケットをブロックしてませんか?
とくにWindows XP SP2のWindowsファイアウォールに注意です。
あとはDCOMの構成は正しいですか?
DCOMCnfg.exe→コンポーネントサービス→コンピュータ→マイ コンピュータ
→DCOMの構成→Windows Management and Instrumentation です。
# 私の場合、WMIは動作するものの、WSHRemoteはどういう設定にしても
# 動作しません…。「メモリが不足しています」ってどういう
# エラーなんでしょう。いちおう、ここの設定を弄るとエラーメッセージが
# 「アクセスできません」とかに変化するので、後一歩なんでしょうが…。
To: なな さん
> 他端末の共有フォルダをネットワークドライブ接続したいのですが、どうしてもダイアログボックスが表示され、パスパスワードの入力が要求されます。 どなたか、パスワードを入力しなくても良い方法をご存知ないでしょうか。
リモート側に、ローカルユーザーと同じユーザー名とパスワードで
ユーザーを登録すれば、パスワードを入力しなくても良かったと思います。
FolderItems.Filter &H40,wildcard
が、wildcard展開に使えるか、試してみたのですが、
リンクについての振る舞いが変です。
例えば、LINK.LNKがあるとき、
"*.*"には入りますが、"L*.*"や"*.LNK"に入りません。
こういうイレギュラリティがあると、使えませんね。
「ファイルを開く」では、"L*.*"や"*.LNK"がきちんと動作するので、
「ファイルを開く」はFolderItems.Filterを使っていないのかも。
ところで、リンクと言えば、
FolderItem.NameやFolderItem.ExtendedProperty("Name")は
拡張子が消えるので、使えません。
そのときの代替方法ですが、
fso.GetFileName(FolderItem.Path)や
Mid(FolderItem.Path,InStrRev(FolderItem.Path,"\")+1)
ですね。備忘のため。
まぁ、他力を頼んでよいのなら、最速は、
StartTime=Timer
MsgBox LenA(String(1000000,"a"))&vbLf&(Timer-StartTime)
StartTime=Timer
MsgBox LenA(String(1000000,"あ"))&vbLf&(Timer-StartTime)
Function LenA(str)
Const adTypeText=2
Set Stream=CreateObject("ADODB.Stream")
Stream.Open
Stream.Type=adTypeText
Stream.Charset="x-sjis"
Stream.WriteText str
LenA=Stream.Size
Stream.Close
End Function
---------------------------
1000000
0.046875
---------------------------
2000000
0.0625
---------------------------
いつもおせわになっております。
分からないことがあり、こちらに伺いました。
他端末の共有フォルダをネットワークドライブ接続したいのですが、どうしてもダイアログボックスが表示され、パスパスワードの入力が要求されます。 どなたか、パスワードを入力しなくても良い方法をご存知ないでしょうか。
リモートマシン上のあるプロセスを取得したいのですが、
上手くできません。
(何かを取得しているようなのですが、nullです。)
ローカルマシン上のプロセスは取得出来るのですが。。。
ご教授お願い致します。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
ローカルマシンのプロセス取得
Set objWMIService = GetObject("winmgmts:\\" & LocalComputer & "\root\cimv2")
Set Pro = Service.ExecQuery("Select * From Win32_Process Where Name = 'TEST.EXE'")
For Each ProSet In Pro
msgRes = MsgBox(ProSet.Caption & "(" & ProSet.ProcessId & ")")
Next
→結果は「TEST.EXE(774)」
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
リモートマシンのプロセス取得
Set objSWbemLocator = CreateObject("WbemScripting.SWbemLocator")
Set objSWbemServices = objSWbemLocator.ConnectServer (RemoteComputer, "\root\cimv2", RemoteUser, RemotePass)
Set Pro = objSWbemServices.ExecQuery("Select * From Win32_Process Where Name = 'TEST.EXE'")
For Each ProSet In Pro
msgRes = MsgBox(ProSet.Caption & "(" & ProSet.ProcessId & ")")
Next
→結果は「()」
はじめまして。
いまWSHでFortranのプログラムを実行させています。
そのFortranのプログラムは、途中にPauseをかけてあります。
そのPauseしたのを認識して、WSHの次のコマンドラインに移る方法ってありますか?
現在は、FortranでPause直前にファイルに終わったことをあらわす数を書き出し、 それをWSHで何回も検索させることで認識させています。
この方法だと検索にメモリーを取られてしまうので、あまり実用的ではありません。
どなたか教えて頂けないでしょうか?よろしくお願いします。
毎月一回、4人のMVPに対して行われるインタビュー「私が日本のMVP 〜コミュニティの達人〜」に、私のインタビューが載りました。
http://www.microsoft.com/japan/communities/mvp/iammvp.mspx
スクリプトの魅力を大いに語ってきました。システム管理者としての視点とはちょっと違うと思いますけど、まだまだ一般ユーザーがその恩恵を享受できる場面は多数存在すると思うので、啓蒙活動の一環でもあります。
もしお暇があれば、ご覧ください。
scriptpw.dllはWeb全体でググると、2番目のサイトでダウンロードできたりします。(ちなみに1番目のサイトではXPや2003からコピーしろと言ってますが、、、)
HomeEditionで使えましたが、ライセンスがよくわからないので、私の場合は自作のCOMでパスワードダイアログを作成して使ってます。ファイルを開くコモンダイアログボックスや、クリップボードの読み書きもCOM使ってます。
なるべくWindows標準で工夫するのが粋だとは思いますが、個人で使う分には自作COMでかまわないし、その方がずっと速いのもので。といおうか、スクリプトの記述がすごく簡単になるので、それが大きいかも。
Delphi製なので、ダイアログなどを含むと、てきめんにサイズが大きくなりますが。
実は文字列のバイト数を求めるのもCOMで作ってたりします。
もしも誰かご要望があれば、Delphi2005でコンパイルしなおしたものを公開しましょうか。
>>管理人むたぐち さん
>>私もやってみました。
VB.NET勉強中ですが文法とアセンブリで
手一杯でRegAsm.Exeなんて知りませんでした。
便利ですねぇ。登録の必要が無いとは言え
DLLをDynaCallで呼ぶ手順を考えると雲泥の差だ。
>>.NETは速いですね〜。
確かに速い。LenDWはマーシャルしてるから
遅いんだろうか(でもどこで?)?
ところで管理人さんはたしかXpですよね。
LenDWはXpでも動くんですね。VARIANT変数や
Const定数の持ち方が変わってるかも知れない
から誰も検証できないかなぁと心配してました。
To: ばんのしゃーによかばんた さん 2005年 06月 26日 16時 05分 03秒
> 中を見ると、"ScriptPW.Password.1"なんてのありますが、
> これも、Proにはあるのですか?
> HomeEditionにはなかったので、XP紹介記事の誤りかと思ってました。
> もし、あるんでしたら、ファイル名を教えてくださいまし。
C:\WINDOWS\System32\scriptpw.dllです。
使用例はhttp://www.microsoft.com/japan/technet/scriptcenter/scripts/misc/password/mspwvb01.mspx
To: ばんのしゃーによかばんた さん 2005年 06月 26日 16時 05分 25秒
> 甲案 "Shell.Application"
http://www.microsoft.com/japan/technet/scriptcenter/scripts/storage/files/stfivb32.mspx
では、33までしか指定してなかったので、それ以降は無いものと
思い込んでました…。