TAK さん 2005年 07月 03日 17時 43分 02秒

こんばんは
ここのサイトの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月 03日 15時 52分 51秒

》せい さん 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 の予約語は公開されているのに……。

ばんのしゃーによかばんた さん 2005年 07月 03日 15時 30分 22秒

音の切れ目が必要なようです。音階の設定は出鱈目です。

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


せい さん 2005年 07月 02日 23時 38分 23秒

流石に今回は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
'^^^

管理人むたぐち さん 2005年 07月 02日 22時 35分 10秒

To: WSH初心者 さん

こちらの環境(Win XP + Windows Script 5.6)では、
CopyHereメソッドを使えばダイアログが表示されました。
ただし、ファイルが少ない場合は表示されません。
これはエクスプローラと同様の動作です。
そちらの環境を教えてください。

WSH初心者 さん 2005年 07月 02日 21時 45分 15秒

はじまして、WSH初心者です。初めて質問させていただきます。

WSHにて、フォルダのコピーのスクリプトを作成しているのですが、
コピーの進行状況が表示されず困っています。
過去の掲示板を見ると、Shell.Applicationを利用すると、コピーの際
進行状況が表示される。と記載されていましたので、行ってみましたが
何も表示されません。

WSHのバージョンも上がっていますので、昔とやり方が変わったのでしょうか?
ご存知の方いらっしゃいましたら、教えてください。
(Web検索を行っても、本掲示板の情報しか見つけられませんでした・・・)

ご助言お願いします。

ばんのしゃーによかばんた さん 2005年 07月 02日 16時 25分 26秒

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音で着メロみたいなの作りません?


ばんのしゃーによかばんた さん 2005年 07月 02日 16時 25分 05秒

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相当はどうすればよいのでしょう?


ばんのしゃーによかばんた さん 2005年 07月 02日 16時 24分 47秒

IEの印刷待ち合わせの別案です。

ie.ExecWB OLECMDID_PRINT,OLECMDEXECOPT_PROMPTUSER
Do While Not wShell.AppActivate("印刷")
 WScript.Sleep 100
Loop
wShell.SendKeys "%p"

わざと印刷ダイアログを表示させて、それを待ち合わせます。
そこまで待てば、後はいいみたいです。


ばんのしゃーによかばんた さん 2005年 07月 02日 16時 24分 26秒

>ばんのしゃーによかばんた さん 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


管理人むたぐち さん 2005年 07月 01日 16時 38分 28秒

「ダウンロード」に「シンプルなバックアップスクリプト」を
追加しました。

これは私が1年以上使っているスクリプトを
一般公開用に書き直したもので、私にとっては
必要かつ十分なスクリプトです。
もし良かったら使ってみてください。

管理人むたぐち さん 2005年 07月 01日 07時 18分 34秒

管理人むたぐちです。
2005年7月〜2006年6月のMSMVP for Visual Developer - Scriptingに再認定されましたので、ここでご報告させていただきます。
この1年間も、よろしくお願いいたします。

ほうじ茶 さん 2005年 06月 30日 09時 21分 55秒

すみません、また躓いてしまいましたorz

テスト機での検証後、本番環境へ導入しようとしたのですが、
本番環境のモデム(Dialupルータ)はコンソールケーブルで接続されておらず
イーサネット接続しかされていません。そのため、サーバー側からデバイス
として認識されず、イーサネットの向こうのモデムをrasdialで制御できません。なぜ自動ダイアルアップさせたいのかと言いますと、A地点とB地点の
それぞれのプライベートネットワークをrasdialでコネクションを張って
1つのLANを作り、ファイルの交換をやりたいのです。

WHS自体の質問からは若干離れているような気もしますが、ご助言願えないでしょうか?

ほうじ茶 さん 2005年 06月 29日 18時 40分 43秒

失礼しました、先ほどrasdialできない件で投稿したものですが、
問題ありません。いろいろいじってる間に解決しました。
どうやらオプションが不足していたようです。

dup.Run("rasdial socs001 socs001 11111", 1, True)

これでうまくいきました。ありがとうございます。

魔界の仮面弁士 さん 2005年 06月 29日 17時 38分 04秒

》管理人むたぐち さん 2005年 06月 29日 15時 38分 30秒

まぁ……やろうと思えば一応可能なんですけどね。

IIS 5.x の場合は、IISADMIN サービスと W3SVC サービスが、
「デスクトップとの対話を許可」に設定されており、かつ、
IISのアプリケーション保護レベルが「IISプロセス」に設定されていて、
さらに、IISの実行アカウントが、処理対象のexeへの実行アクセス権を
有しているならば、ASP上から起動したアプリも表示されます。

ただ、安全面からお奨めできる設定ではありませんので、
私の回答としては、やはり、
> (ウィンドウを表示させるようなアプリ)は使えない、と思った方が良いかと。
という方向で。(^_^;)

ほうじ茶 さん 2005年 06月 29日 17時 15分 17秒

AirH"を使い、rasdialコマンドを利用してダイアルアップルーターへ
接続しようとしています。
DOS窓から、

rasdial 接続名 ユーザー名 パスワード

を実行し、接続が確立すること(AirH"がアクティブになり発信→ルータ着信)を確認しましたが、スクリプトに

Set dup = CreateObject("Wscript.Shell")
dup.Run "cmd.exe /k rasdial 接続名 ユーザー名 パスワード"

を組んで動作確認したところ、AirH"が反応してくれません。
OSはWinodwsXP、ダイアルアップルータはNTT-MEです。
WSHで動かないDOSコマンドってあるでしょうか・・・?

管理人むたぐち さん 2005年 06月 29日 15時 38分 30秒

To: 魔界の仮面弁士 さん

IISはちょっとわかりませんが、04WebServerだと、コントロール
パネルの「サービス」で「デスクトップとの対話を許可」に
チェックを入れると、表示されるようになります。

魔界の仮面弁士 さん 2005年 06月 29日 11時 39分 17秒

》熊太郎 さん 2005年 06月 29日 09時 39分 05秒
> 画面にNotepadが起動されません。これは、こういうものなのでしょうか?
そういうものです。
サービスが利用するデスクトップと、管理者等が見ているデスクトップは別なので、
IIS上で実行したアプリが、管理者が見ている画面上に表示される事は無いと思います。


そもそも、「画面」が無い状態――管理者も含め、誰もサーバーにログオンして
いない状況――であっても、IISは実行されますしね。

逆に、複数のデスクトップ画面があった場合――その Windows Server に対して、
同時に複数のユーザーがログオンしていた場合――――でも、IISは稼動します。


ですから、IISから実行させる場合、デスクトップとの対話を必要とするもの
(ウィンドウを表示させるようなアプリ)は使えない、と思った方が良いかと。

熊太郎 さん 2005年 06月 29日 09時 39分 05秒

ASPでの外部プログラムの実行について
 初心者ですいません。このサイトでもしばしば見かける次のASPファイル
 をブラウザより実行すると、タスクマネージャーのプロセス一覧には、表示
 されるのですが、アプリケ−ションの一覧には、表示されず、IISのサーバ
 画面にNotepadが起動されません。これは、こういうものなのでしょうか?
 それとも方法によっては、起動させることができるのでしょうか?
 どなたか、お教えください。よろしく、お願いいたします。

<%
     Set objShell = Server.CreateObject ("WScript.Shell")
     objShell.Run "Notepad.exe", 1, False
     Set objShell = Nothing
%>

ばんのしゃーによかばんた さん 2005年 06月 28日 19時 28分 37秒

>管理人むたぐち さん 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ループしてるのではありませんか?


ばんのしゃーによかばんた さん 2005年 06月 28日 19時 28分 24秒

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日 19時 28分 09秒

>管理人むたぐち さん 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


ばんのしゃーによかばんた さん 2005年 06月 28日 19時 27分 57秒

文字列の桁が違いましたね。

桁を合わせると、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月 28日 19時 27分 42秒

>つちや さん 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ならサイズも小さいし。


かば さん 2005年 06月 28日 18時 20分 16秒

すみません。
追記させてください。

現在のユーザは管理者権限がありません。
・・・ひょっとして、それのせいでしょうか?

かば さん 2005年 06月 28日 18時 16分 49秒

TO BUNさん

バッチ流し終わった後はOSの再起動をかけております。

かば さん 2005年 06月 28日 18時 15分 54秒

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

上記コードなのですが、
何かまずいのでしょうか?

#すみません。
ソースを乗せてしまいました。

BUN さん 2005年 06月 28日 18時 12分 33秒

検証もしていないので、申し訳ないのですが、
バッチ終了後に、OSをリブートしても変更されていませんか?


管理人むたぐち さん 2005年 06月 28日 18時 10分 16秒

To: かば さん

OSは何でしょうか?
とりあえずWindows 2000で確認したところ、ログオフ後に
リンク先が変更されるようです。

かば さん 2005年 06月 28日 18時 02分 09秒

はじめまして。

現在、マイドキュメントのリンク先を変更するバッチを作成しております。
デフォルトで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のままなのです。

何か変更するものが足りないのでしょうか?
ご存知でしたら、ご教授いただけると幸いです。

よろしくお願いいたします。



BUN さん 2005年 06月 28日 17時 46分 07秒

To: 管理人たむぐちさん

Left関数、IF文で何とかできました。
有難うございます。

少々、インチキ臭い判定の仕方ですが、
今回の件の使用には、耐えそうです。

Win98のクライアントは、さっさと移行してしまいたいものです。

管理人むたぐち さん 2005年 06月 28日 16時 39分 32秒

To: BUN さん

Left関数、CDbl関数、If...Then...Elseステートメントを使えば可能です。
詳しくはWindows Script 5.6のヘルプをどうぞ。

BUN さん 2005年 06月 28日 16時 28分 40秒

To: 管理人たむぐちさん

kernel32.dllのバージョンが、
同じOSでも複数ある様なので、
先に教えていただいた、Caseの部分を修正していたのですが、
中々思うようにいきません。

sVerでの文字列を、頭3桁だけ取り、
不等式で判定をしようと考えています。

思惑
 a=sVer(頭3桁)
 Case a<4.9: GetOSName = "Windows 98SE"
 Case a<5.0: GetOSName = "Windows ME"
このような感じをイメージしています。

何か、良い方法はありませんでしょうか?

度々の質問に、失礼致します。

BUN さん 2005年 06月 28日 14時 31分 37秒

To: 管理人たむぐちさん

早いレス、有難うございます。
早速、Case等の部分を修正して使用してみました。
スムーズに動いています。
とても、助かりました。 ^^

新規に導入するアプリの為、
クライアントPCの環境を調べている最中だったのです。
(台数が、1000台を越す割には、環境資料がないのです)

メモリの表示が、Win98で出来ないのは残念ですが、
元々Win98→WinXpに、移行するための台数調査が、
メインなので、なんとかなりそうです。

こちらのHPは、しばらく病み付きのように、見てそうです。
WSHって、こんなにも使える物だったのか〜

管理人むたぐち さん 2005年 06月 28日 13時 35分 25秒

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

可哀想なカムラン さん 2005年 06月 28日 12時 51分 55秒

TO:管理人むたぐち さん


> ファイアウォールがパケットをブロックしてませんか?
> とくにWindows XP SP2のWindowsファイアウォールに注意です。
> あとはDCOMの構成は正しいですか?

→FWは無効ですし、DCOM構成もデフォルトのままなのですが。。。
 ただ、別のマシンで行ったところ問題なく取得できました。
 プログラムが問題ではないことが確認できて良かったです。
 有難うございました。

BUN さん 2005年 06月 28日 12時 30分 23秒

下の投稿の追伸です。

調査したいPCのOSの種類は、Win98、WinMe、Win2K、WinXp です。

実装している物理メモリは、
こちらのHPにあった、GetSystemInformation で解る見たいんですが、
あいにくOSの条件があるらしくて、無理っぽいです。

BUN さん 2005年 06月 28日 11時 50分 39秒

会社資産のPCの環境を整理しているのですが、
台数が多いので、WSHで上手くいかないかと思案しています。

必要な環境情報が
Cドライブの空き容量
実装メモリ
OSの種類

この内、ドライブの空き容量は、
Driveオブジェクトから分ったのですが、
実装メモリとOSの種類がの取得方法がわかりません。
識者のかた、ご教授くださいませ。


WSHやらVBS等、初めて触る物で、
こちらのHPを参考にしながら、勉強しております。(昨日から)
このHPは、分りやすくて助かります。

marino さん 2005年 06月 28日 10時 27分 26秒

To: なな さん
> 他端末の共有フォルダをネットワークドライブ接続したいのですが、どうしてもダイアログボックスが表示され、パスパスワードの入力が要求されます。 どなたか、パスワードを入力しなくても良い方法をご存知ないでしょうか。

Set WSHNetwork = WScript.Createobject("WScript.Network")
WSHNetwork.MapNetworkdrive "ドライブ名" , "共有名" , "プロファイルの更新フラグ{False , True}" , "UserName" , "UserPass" 
でいけるとおもいます。

せい さん 2005年 06月 28日 02時 22分 39秒

色々な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
---------------------------

管理人むたぐち さん 2005年 06月 27日 18時 10分 29秒

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: なな さん

> 他端末の共有フォルダをネットワークドライブ接続したいのですが、どうしてもダイアログボックスが表示され、パスパスワードの入力が要求されます。 どなたか、パスワードを入力しなくても良い方法をご存知ないでしょうか。

リモート側に、ローカルユーザーと同じユーザー名とパスワードで
ユーザーを登録すれば、パスワードを入力しなくても良かったと思います。

ばんのしゃーによかばんた さん 2005年 06月 27日 18時 03分 01秒

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)
ですね。備忘のため。


ばんのしゃーによかばんた さん 2005年 06月 27日 18時 02分 45秒

まぁ、他力を頼んでよいのなら、最速は、

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
---------------------------


なな さん 2005年 06月 27日 17時 07分 55秒

いつもおせわになっております。

分からないことがあり、こちらに伺いました。

他端末の共有フォルダをネットワークドライブ接続したいのですが、どうしてもダイアログボックスが表示され、パスパスワードの入力が要求されます。 どなたか、パスワードを入力しなくても良い方法をご存知ないでしょうか。

可哀想なカムラン さん 2005年 06月 27日 14時 48分 20秒

リモートマシン上のあるプロセスを取得したいのですが、
上手くできません。
(何かを取得しているようなのですが、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

→結果は「()」
 

まどく さん 2005年 06月 27日 14時 33分 27秒

はじめまして。

いまWSHでFortranのプログラムを実行させています。
そのFortranのプログラムは、途中にPauseをかけてあります。
そのPauseしたのを認識して、WSHの次のコマンドラインに移る方法ってありますか?

現在は、FortranでPause直前にファイルに終わったことをあらわす数を書き出し、 それをWSHで何回も検索させることで認識させています。
この方法だと検索にメモリーを取られてしまうので、あまり実用的ではありません。
どなたか教えて頂けないでしょうか?よろしくお願いします。

管理人むたぐち さん 2005年 06月 27日 12時 14分 13秒
URL:http://www.microsoft.com/japan/communities/mvp/iammvp.mspx

毎月一回、4人のMVPに対して行われるインタビュー「私が日本のMVP 〜コミュニティの達人〜」に、私のインタビューが載りました。
http://www.microsoft.com/japan/communities/mvp/iammvp.mspx

スクリプトの魅力を大いに語ってきました。システム管理者としての視点とはちょっと違うと思いますけど、まだまだ一般ユーザーがその恩恵を享受できる場面は多数存在すると思うので、啓蒙活動の一環でもあります。
もしお暇があれば、ご覧ください。

つちや さん 2005年 06月 26日 21時 26分 40秒

scriptpw.dllはWeb全体でググると、2番目のサイトでダウンロードできたりします。(ちなみに1番目のサイトではXPや2003からコピーしろと言ってますが、、、)

HomeEditionで使えましたが、ライセンスがよくわからないので、私の場合は自作のCOMでパスワードダイアログを作成して使ってます。ファイルを開くコモンダイアログボックスや、クリップボードの読み書きもCOM使ってます。
なるべくWindows標準で工夫するのが粋だとは思いますが、個人で使う分には自作COMでかまわないし、その方がずっと速いのもので。といおうか、スクリプトの記述がすごく簡単になるので、それが大きいかも。
Delphi製なので、ダイアログなどを含むと、てきめんにサイズが大きくなりますが。

実は文字列のバイト数を求めるのもCOMで作ってたりします。

もしも誰かご要望があれば、Delphi2005でコンパイルしなおしたものを公開しましょうか。

せい さん 2005年 06月 26日 18時 08分 11秒

>>管理人むたぐち さん

>>私もやってみました。
VB.NET勉強中ですが文法とアセンブリで
手一杯でRegAsm.Exeなんて知りませんでした。
便利ですねぇ。登録の必要が無いとは言え
DLLをDynaCallで呼ぶ手順を考えると雲泥の差だ。

>>.NETは速いですね〜。
確かに速い。LenDWはマーシャルしてるから
遅いんだろうか(でもどこで?)?

ところで管理人さんはたしかXpですよね。
LenDWはXpでも動くんですね。VARIANT変数や
Const定数の持ち方が変わってるかも知れない
から誰も検証できないかなぁと心配してました。

管理人むたぐち さん 2005年 06月 26日 17時 12分 13秒

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までしか指定してなかったので、それ以降は無いものと
思い込んでました…。

Return