ばんのしゃーによかばんた さん 2004年 12月 01日 17時 34分 00秒

>ばんのしゃーによかばんた さん 2004年 08月 18日 19時 39分 06秒
>>祥子 さん 2004年 02月 04日 15時 45分 14秒
>>InternetExplorerの「インターネット一時ファイルの削除」
>>と同じことを、CUIで実現したいです。
>Set Shell=CreateObject("Shell.Application")
>Set Folder=Shell.NameSpace(32)
>では、普通のフォルダやファイルのように見えて、
>エクスプローラの表示のようには見えません。なんで?

この記事を改訂。

これには、二通りの方法があります。

ひとつは、前述のとおり、

>実ディレクトリ
>C:\Documents and Settings\Administrator\Local Settings\Temporary Internet Files
の DESKTOP.INI を見てみると、
>[.ShellClassInfo]
>UICLSID={7BD29E00-76C1-11CF-9DD0-00A0C9034933}
>のようになっていました。試しに、これを、
>[.ShellClassInfo]
>UICLSID={7BD29E00-76C1-11CF-9DD0-00A0C9034933} ※不要
>CLSID={7BD29E00-76C1-11CF-9DD0-00A0C9034933}
>のように書き換えてやると、
>Shell.Applicationでも、エクスプローラと同じ情報が見えるようになりました。
>Folder.GetDetailsOf(FolderItem,n)

もうひとつは、DESKTOP.INIはそのままで、
shell.NameSpaceでなく、
shell.Openで開きます。
――――――――――――――――――――――――――――――――――――――
Set shell=CreateObject("Shell.Application")
shell.Open(shell.NameSpace(32).Self.Path)

Do
Set ie=shell.Windows.Item
If TypeName(ie)="IWebBrowser2" Then
If ie.LocationName="Temporary Internet Files" Then Exit Do
End If
WScript.Sleep 1000
Loop

Do
If InStr(ie.StatusText,"個のオブジェクト") Then Exit Do
WScript.Sleep 1000
Loop

Set Folder=ie.Document.Folder
For Each FolderItem In Folder.Items
dd=DateDiff("d",Folder.GetDetailsOf(FolderItem,6), Now)
If dd >= 30 then
FolderItem.InvokeVerb("削除(&D)")
End If
Next
WScript.Sleep 1000
ie.Quit
――――――――――――――――――――――――――――――――――――――
ただし、フォルダウィンドウが表示されます。

フォルダウィンドウを非表示にしたいときは、
shell.Open(shell.NameSpace(32).Self.Path)
の代わりに
Set wShell=CreateObject("WScript.Shell")
call wShell.Run("Explorer.exe " & shell.NameSpace(32).Self.Path,0,True)
とします。

あと、
FolderItem.InvokeVerb("削除(&D)") '98/ME/2000/XP
FolderItem.InvokeVerb("delete") '2000?/XP
FolderItem.InvokeVerbEx("delete") '2000/XP
は、
一般ファイルは、同期で、プロンプト。
ゴミ箱は、非同期で、プロンプト。
インターネット一時ファイルは、同期/非同期?不明で、プロンプトなし。
と、様々なようです。
InvokeVerb自体は同期で、InvokeVerbの先が同期だったり、非同期だったり、
するんですね。

ごんた さん 2004年 12月 01日 16時 47分 50秒

ネットワークで繋がったAとBのPCがあり、AからBに設定してあるタスクをキックするVBスクリプトの書き方を探しています。
それと、B上でキックするタスクはBの内容をバックアップするタスクです。

A(VBS)⇒B(タスク起動) タスクの中身はBのファイルをBのバックアップフォルダへ移動させる。

宜しくお願いします。

ちゃっぴ さん 2004年 11月 29日 23時 34分 23秒

To ファルコ さん

> ど素人なので、どんな風に使用すれば良いか分りません。
> すいませんが、使用方法まで教えてください。

どこがわからないのでしょう?
まったく何もわからないというなら、ここの「VBS講座・基礎編」を
参考にしてお勉強ください。

特定の箇所がわからないというなら、そこを必ず指摘してください。

ファルコ さん 2004年 11月 29日 22時 24分 26秒

ちゃっぴ さん 2004年 11月 27日 23時 17分 30秒 ヘ

ご返答ありがとうございます。

ど素人なので、どんな風に使用すれば良いか分りません。
すいませんが、使用方法まで教えてください。
宜しくお願いします。

(管理人により削除) さん 2004年 11月 29日 21時 10分 28秒

(管理人により削除)

むちゃ さん 2004年 11月 28日 20時 14分 26秒

To: ばんのしゃーによかばんた さん

ありがとうございます。

照会していただいたやつを色々試してみます。m(_ _)m

ばんのしゃーによかばんた さん 2004年 11月 28日 16時 18分 25秒

ファイル削除
FolderItem.InvokeVerb("削除(&D)")
FolderItem.InvokeVerbEx("delete")
のプロンプトを出さない方法を研究していたのですが、

>管理人むたぐち さん 2000年 03月 18日 18時 24分 44秒
>以下に挙げるのは、30日以上前にごみ箱に入れたファイルを抹消するスクリプトです。
>実行するとわかるんですが、スクリプトが「削除するか?」と聞いた後、今度は
>エクスプローラが「削除するか?」と聞いてきます。
>スクリプトのメッセージを削ると、エクスプローラの削除確認ダイアログが
>いっぺんに表示されてしまいます。
>(もちろんFileSystemObjectでDeleteは不可能です)
>「削除確認を出さないで削除する方法がない」ことと、「複数ファイルを一度に
>削除する方法がない」ことが問題です。これはどうしようもないんじゃないでしょうか。

ごみ箱の「中」のファイル削除は、
FolderItem.Pathをfso.DeleteFileすればよいようです。:-)

Const ssfBITBUCKET = 10
Set Shell=CreateObject("Shell.Application")
Set fso=CreateObject("Scripting.FileSystemObject")
Set Folder=Shell.NameSpace(ssfBITBUCKET)
For Each FolderItem In Folder.Items
: dd=DateDiff("d",Folder.GetDetailsOf(FolderItem,2), Now)
: If dd >= 30 then
: : fso.DeleteFile(FolderItem.Path)
: End If
Next

※フォルダの処理が必要かも。
※Loop中の削除はヤバイかも。:-p

ごみ箱の「外」のファイル削除は、
Shell.NameSpace(ssfBITBUCKET).MoveHere FolderItem
WScript.Sleep 1000
でよいようです。ポイントは待ちを入れることです。:-)
ここで、待たないとNOPになります。:-<

>管理人むたぐち さん 2001年 06月 22日 22時 45分 04秒
>Set oFolder=Shell.NameSpace (ssfBITBUCKET)
>oFolder.MoveHere oLink.FullName
>ところがこれ、何も起こりません。(Win2000)
>MoveHereの代わりにCopyHereを使うと、ファイルが存在しないのに上書き
>確認ダイアログが出て、しかも共有違反エラーが出て終了してしまいます。
>他のフォルダだとうまくいくので、これはごみ箱特有の問題のようです。
>MoveHereメソッドの第二引数をいろいろ変えてみたんですが、それでも
>駄目でした。なぜだろう?

これは、待たなかったせいですね。:-p

また、ごみ箱では、
Folder.Items.Item("name")
Folder.ParseName("name")
は、使えないようです。同じ名前があり得るせいかな。

ばんのしゃーによかばんた さん 2004年 11月 28日 16時 17分 30秒

>管理人むたぐち さん 2004年 11月 05日 16時 41分 21秒
>フォルダの作成に関しては、以前Wikiに書いておきました。
>http://winscript.s41.xrea.com/wiki/index.php?%5B%5B%A5%C6%A5%AF%A5%CB%A5%C3%A5%AF%5D%5D

こういうエンコードされたURLをデコードしたいと思うのは私だけでしょうか?

URLをデコードするVBScriptです。※ちょっと長い。
対象エンコードは、Shift_JISとUTF-8とEUCです。
――――――――――――――――――――――――――――――――――――――
Option Explicit
Dim url
Dim sjis
Dim error

Do
url=InputBox(fold(url) & vbCRLF & fold(sjis),"Enter URL to decode",sjis)
If IsEmpty(url) Then Exit Do
If InStr(UCase(url),"UTF-8") Then
sjis=decodeUTF8(url)
ElseIf InStr(UCase(url),"EUC") Then
sjis=decodeEUC(url)
ElseIf InStr(UCase(url),"SHIFT_JIS") Then
sjis=decodeSJIS(url)
Else
sjis=decodeEUC(url)
If sjis="" Then sjis=decodeSJIS(url)
If sjis="" Then sjis=decodeUTF8(url)
If sjis="" Then sjis=error
End If
Loop

Function decodeSJIS(ByVal src)
Dim dst,k,char,asc1,asc2
src=UnEscape(src)
For k=1 To Len(src)
char=Mid(src,k,1)
Asc1=AscW(char)
If Asc1=43 Then Asc1=32
If (&H00 <= Asc1 And Asc1 <= &H80) Or _
(&HA0 <= Asc1 And Asc1 <= &HDF) Then
char=Chr(Asc1)
ElseIf (&H81 <= Asc1 And Asc1 <= &H9F) Or _
(&HE0 <= Asc1 And Asc1 <= &HFF) Then
k=k + 1
char=Mid(src,k,1)
Asc2=AscW(char)
If Asc2<64 Or Asc2>252 Then
error="Invalid SJIS second byte : " & Right(Hex(Asc2+256),2)
Exit Function
End If
char=Asc1*256+Asc2
If (Asc(chr(char)) And &HFFFF&)=char Then
char=Chr(char)
Else
char="%s" & Right(Hex(char+256*256),4)
error="Invalid SJIS code : " & char
Exit Function
End If
Else
error="Invalid SJIS first byte : " & Right(Hex(Asc1+256),2)
Exit Function
End If
dst=dst & char
Next
decodeSJIS=dst
End Function

Function decodeEUC(ByVal buf)
Dim code
Dim code1
Dim code2
Dim k
Dim euc

buf=UnEscape(buf)
For k=1 To Len(buf)
code=AscW(Mid(buf,k,1))
If code=43 Then code=32
If code<&H80 Then
euc=euc & Chr(code)
ElseIf code=&H8E Then
k=k+1
code=AscW(Mid(buf,k,1))
euc=euc & Chr(code)
Else
code1=code
k=k+1
code2=AscW(Mid(buf,k,1))
code=jis2sjis((code1 And &H7F) * 256 + (code2 And &H7F))
If code Then
euc=euc & Chr(code)
Else
euc=euc & "%" & Right(Hex(code1+256),2) & "%" & Right(Hex(code2+256),2)
error="Invalid EUC code : " & Right(Hex(code1+256),2) & Right(Hex(code2+256),2)
Exit Function
End If
End If
Next
decodeEUC=euc
End Function

Function jis2sjis(j)
Dim s
Dim a
Dim b

a=j \ 256
b=j mod 256
If 33<=a And a<= 94 Then
If a mod 2 Then
If 33<=b And b<= 95 Then
s=a*128+b+28831
ElseIf 96<=b And b<=126 Then
s=a*128+b+28832
Else
s=0
End if
Else
If 33<=b And b<=126 Then
s=a*128+b+28798
Else
s=0
End If
End If
ElseIf 95<=a And a<=126 Then
If a mod 2 Then
If 33<=b And b<= 95 Then
s=a*128+b+45215
ElseIf 96<=b And b<=126 Then
s=a*128+b+45216
Else
s=0
End If
ElseIf 33<=b And b<=126 Then
s=a*128+b+45182
Else
s=0
End If
Else
s=0
End If
If s=0 Then
error="Invalid JIS Code : " & Right(Hex(a+256),2) & Right(Hex(b+256),2)
End If
jis2sjis=s
End Function

Function decodeUTF8(ByVal buf)
Dim code
Dim code1
Dim code2
Dim code3
Dim k
Dim sjis

buf=UnEscape(buf)
For k=1 To Len(buf)
code=AscW(Mid(buf,k,1))
If code=43 Then code=32
If 0<=code And code<128 Then
sjis=sjis & ChrW(code)
ElseIf 128+64<=code And code<128+64+32 Then
code1=code
k=k+1
code2=AscW(Mid(buf,k,1))
code=(code1 And &H1F) * 64 + (code2 And &H3F)
If Chr(Asc(ChrW(code)))=ChrW(code) Then
sjis=sjis & ChrW(code)
Else
sjis=sjis & Escape(ChrW(code))
error="Invalid UTF-8 Code : " & Escape(ChrW(code)) & " " & Right(Hex(code1+256),2) & Right(Hex(code2+256),2)
End If
ElseIf 128+64+32<=code And code<128+64+32+16 Then
code1=code
k=k+1
code2=AscW(Mid(buf,k,1))
k=k+1
code3=AscW(Mid(buf,k,1))
code=(code1 And &H0F) * 16 * 256 + (code2 And &H3F) * 64 + (code3 And &H3F)
If Chr(Asc(ChrW(code)))=ChrW(code) Then
sjis=sjis & ChrW(code)
Else
sjis=sjis & Escape(ChrW(code))
error="Invalid UTF-8 Code : " & Escape(ChrW(code)) & " " & Right(Hex(code1+256),2) & Right(Hex(code2+256),2) & Right(Hex(code3+256),2)
End If
Else
sjis=sjis & Escape(ChrW(code))
error="Invalid UTF-8 Code : " & Escape(ChrW(code)) & " " & Right(Hex(code+256),2)
End If
Next
decodeUTF8=sjis
End Function

Function Fold(src)
Dim k
Dim dst
Dim char
Dim col,cols
For k=1 To Len(src)
char=Mid(src,k,1)
Select Case Asc(char) And &HFF00&
Case 0 col=1
Case Else col=2
End Select
cols=cols+col
If cols>39 Then
dst=dst & vbCRLF & char
cols=col
Else
dst=dst & char
End If
Next
Fold=dst
End Function
――――――――――――――――――――――――――――――――――――――

ちなみにエンコードのほうは、
Set SAOC=CreateObject("SearchAssistantOC.SearchAssistantOC")
Encode=SAOC.EncodeString(str,"shfit_jis",false)
で、簡単にできましたが、試してみると、出来なくなったみたい?

また、UTF-8に限れば、JScriptの{Encode|Decode}URI[Component]ですね。

ばんのしゃーによかばんた さん 2004年 11月 28日 16時 16分 49秒

>むちゃ さん 2004年 11月 25日 13時 48分 32秒
>最近、HTML(HTA)上で標準の ActiveX 等を使用して、[ファイルの保存]ダイアログを実現しようと探索しいたところ、ここで、Dialog Helper Object を発見することができました。
>色々探してみましたが(MSDN等も) savefiledlg の実行時に既存ファイル以外を指定させる方法って誰かしりませんか???

過去記事の通りです。
http://www.google.com/search?q=site:www.roy.hi-ho.ne.jp+savefiledlg

>ばんのしゃーによかばんた さん 2004年 04月 02日 18時 54分 39秒
>open file dialogの続き
>savefiledlgは、これで待望のSaveAsダイアログが出来ると思ったら間違いで、
>openfiledlgと全く同じで、既存ファイルしか選択出来ません。がっかり。

ただ、openfiledlg や <input type=file> でも、右クリックの「新規作成」で
ファイルを作って、それを指定することで代替は可能です。

Windows XPであれば、以下が使えます。
――――――――――――――――――――――――――――――――――――――
Set fs=CreateObject("SAFRCFileDlg.FileSave")
fs.FileName="c:\vbs\*.vbs"
fs.FileType="*.txt"
rc=fs.OpenFileSaveDlg()
WScript.Echo rc
WScript.Echo fs.FileName
――――――――――――――――――――――――――――――――――――――
Set uacd=CreateObject("UserAccounts.CommonDialog")
uacd.InitialDir="C:\vbs"
uacd.Filter="text|*.txt|all|*.*"
uacd.FilterIndex=2
uacd.Flags=0
rc=uacd.ShowOpen()
WScript.Echo rc
WScript.Echo uacd.FileName
――――――――――――――――――――――――――――――――――――――

Excelが使えるなら、
――――――――――――――――――――――――――――――――――――――
Set xl=CreateObject("Excel.Application")
xfilter="テキストファイル(*.txt),*.txt,すべてのファイル(*.*),*.*"
WScript.Echo xl.GetSaveAsFileName("c:\vbs\*.txt",xfilter)
――――――――――――――――――――――――――――――――――――――

CommonDialogが使えるなら、
――――――――――――――――――――――――――――――――――――――
Set cd=CreateObject("MSComDlg.CommonDialog")
cd.Filter= "VBSファイル(*.vbs)|*.vbs"
cd.MaxFileSize=5000
cd.FilterIndex=0
cd.InitDir="c:\vbs"
cd.Flags=0
cd.ShowOpen
WScript.Echo cd.FileName
――――――――――――――――――――――――――――――――――――――

こんなのも。でもライセンスエラー。???
――――――――――――――――――――――――――――――――――――――
Set cd=CreateObject("DlgObjs.ChooseFile")
cd.Filters.Add "text:*.txt"
cd.Save=True
cd.Directory="c:\vbs"
cd.Show
WScript.Echo cd.FileName
――――――――――――――――――――――――――――――――――――――

ばんのしゃーによかばんた さん 2004年 11月 28日 16時 16分 13秒

>ばんのしゃーによかばんた さん 2004年 11月 03日 17時 44分 27秒
>今度は、UTF-8をQuoted-Printableにしたメールが来ました。:-<
>みなさんは普通に読めるんでしょうか。
>UTF-8のQuoted-PrintableをSJISにするフィルタです。

この手のものは、ファイル名の拡張子を.MHTMLにするだけで、IEで読めますね。

>ばんのしゃーによかばんた さん 2004年 10月 03日 17時 31分 53秒
>珍しく、UTF-8のメールが来ました。こんなの初めてです。
>本文の方は既存のVBScriptでコード変換して読めましたが、

これも同様にIEで読めますが、さらに、
UTF-8テキストをNotePadで誤りなく自動判別して読めるようにするには、
ファイルの先頭にバイナリのEF BB BFを入れるとよいようです。

EF BB BFはUnicodeのBOM(Byte Order Mark)のFF FE(Little Endian)をUTF-8に
エンコードしたものです。

もし、バイナリエディタがなければ、NotePadで、空のファイルを
名前を付けて保存で、文字コードをUTF-8に変えて、名前をutf8.txtとして保存し、
COPY /b utf8.txt + hoge.txt fox.txt
で、出来ます。

ちゃっぴ さん 2004年 11月 28日 00時 03分 02秒

To まささん

> 某サイトのサンプルコードを使ってPCのIPアドレスを
> 表示しようとしています。

この手のComputerの情報取得はWMIを使えるようになると便利です。

'IP Address列挙。(NT4.0 SP4以降)
Dim objWMIService, colItems, objItems, strIPAddress

Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
Set colItems = objWMIService.ExecQuery( _
"SELECT Caption, IPAddress FROM Win32_NetworkAdapterConfiguration",,48)
For Each objItem in colItems
WScript.Echo objItem.Caption
For Each strIPAddress In objItem.IPAddress
WScript.Echo strIPAddress
Next
Next

ご参考に・・・
Win32_NetworkAdapterConfiguration
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmi/win32_networkadapter.asp

ちゃっぴ さん 2004年 11月 27日 23時 17分 30秒

ファルコ さん 2004年 11月 25日 12時 59分 28秒 へ

> ネットワークの設定を有効(デフォルト)→無効→有効(再起動チック)
> と出来るようなWHSを調べているのですが、うまくいきません。

WMIを使用してはいかがでしょう。(NT4.0 SP4以降)

あらかじめ下記Codeを実行して、変更を行う「NetworkAdapter名」を
取得しておいて、

'NetworkAdapter名列挙
Dim objWMIService, colItems, objItems

Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
Set colItems = objWMIService.ExecQuery( _
"SELECT Caption FROM Win32_NetworkAdapter",,48)
For Each objItem in colItems
Wscript.Echo objItem.Caption
Next

こいつを実行してみてください。

'NetworkAdapter再起動
Dim objWMIService, colItems, objItems, strAdapterCaption

Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
Set colItems = objWMIService.ExecQuery( _
"SELECT * FROM Win32_NetworkAdapter WHERE Caption='" _
& strAdapterCaption & "'")
For Each objItem in colItems
objItem.Reset
Next

詳細はここを参照してください。
Win32_NetworkAdapter
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmi/win32_networkadapter.asp

Adapterの設定変更なら
Win32_NetworkAdapterConfigurationも役に立つかも?

ばんのしゃーによかばんた さん 2004年 11月 27日 16時 02分 31秒

>たくや さん 2004年 11月 17日 16時 15分 19秒
> JavaScriptで値を保存するのに
> WSHでレジストリを読み書きするのではなく、
> WINAPIの
> GetPrivateProfileString
> WritePrivateProfileString
> などを利用して
> 初期ファイルの読み書きができればと考えているのですが、
> 方法があれば教えていただけませんか?

Wordを使えば簡単です。

Set oWord=CreateObject("Word.Application")
oWord.Visible=True
oWord.System.PrivateProfileString("c:\vbs\a.ini","section","key")="a"
WScript.Echo oWord.System.PrivateProfileString("c:\vbs\a.ini","section","key")
oWord.Quit

ばんのしゃーによかばんた さん 2004年 11月 27日 16時 02分 00秒

>たらちゃん さん 2004年 11月 22日 23時 37分 06秒
>いきなりの質問で申し訳ないのですが、WSHからExcelを立ち上げて個人用マクロブックのマクロを実行したいのですが、うまくいきません。
>もしよろしければ、サンプルコードも示して教えていただけないでしょうか?ちなみにWSHはVBScriptで書いています。

過去記事を検索すれば、すぐ見つかると思います。例えば、
http://www.google.com/search?q=site:www.roy.hi-ho.ne.jp+Excel+Run+マクロ

(管理人により削除) さん 2004年 11月 27日 02時 51分 51秒

(管理人により削除)

ばんのしゃーによかばんた さん 2004年 11月 26日 17時 06分 57秒

>bb さん 2004年 11月 09日 13時 09分 26秒
>[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Network\{4D36E972-E325-11CE->BFC1-08002BE10318}\{9337EC87-E5C5-46F1-974E-03071375B6E8}\Connection]
>"ShowIcon"=dword:00000001
>であり、この中の\Network\ の次 {4D36・・・0318} とその次 {9337・・・B6E8}
>がPCによって異なるのでこの2箇所をワイルドカードのようにしたいのです。
>実際に書き込むのは\Connection の下の"ShowIcon"=dword:00000001 です。

こんなとき、Unixであれば、
シェルスクリプト や sed,awk,perlなどのフィルタでやるのでしょうが、
Windowsの場合は、バッチ か WSHでしょうか。

バッチなら分かりますか?
――――――――――――――――――――――――――――――――――――――
@Echo Off
SetLocal EnableDelayedExpansion

Set sReg=%RANDOM%.REG
Set dReg=%RANDOM%.REG

RegEdit.EXE /E %sreg% "HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Network"
If Not %ErrorLevel%==0 GoTo ERROR

Set flag=FALSE

For /F "usebackq delims=` tokens=1*" %%0 In (`More "%sReg%"`) Do (
Set line=%%0
If !flag!==FALSE (
Echo !line!>>%dReg%
Echo.>>%dReg%
Set flag=TRUE
)
If "!line:~-12!"=="\Connection]" (
Echo !line!>>%dReg%
Echo "ShowIcon"=dword:00000001>>%dReg%
Echo.>>%dReg%
)
)

RegEdit.EXE %dReg%
If Not %ErrorLevel%==0 GoTo ERROR
Del %sReg%
Del %dReg%
GoTo :EOF
:ERROR
Echo Failed To Run RegEdit %ErrorLevel%
:EOF

WSHならこうです。
――――――――――――――――――――――――――――――――――――――
Option Explicit
Dim fso
Dim wShell

Set fso=CreateObject("Scripting.FileSystemObject")
Set wShell=CreateObject("WScript.Shell")

Dim tFolder
Dim tName
Dim sPath
Dim dPath
Dim run
Dim rc
Dim sFile
Dim dFile
Dim line
Dim k

Set tFolder=fso.GetFolder(".")
tName=fso.GetTempName()
sPath=fso.BuildPath(tFolder.Path,tName)
tName=fso.GetTempName()
dPath=fso.BuildPath(tFolder.Path,tName)

run="regedit /e """ & sPath & _
""" ""HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Network"""
rc=wShell.Run(run,,True)
If rc<>0 Then
WScript.Echo "Failed To Run...",rc,vbCRLF,run
WScript.Quit
End If

Set sFile=fso.OpenTextFile(sPath,,,vbUseDefault)
Set dFile=fso.CreateTextFile(dPath,,vbUseDefault)

Do While Not sFile.AtEndOfStream
line=sFile.ReadLine
k=k+1
If k=1 Then
dFile.WriteLine line
dFile.WriteBlankLines 1
End If
If InStr(line,"\Connection]") Then
dFile.WriteLine line
dFile.WriteLine """ShowIcon""=dword:00000001"
dFile.WriteBlankLines 1
End If
Loop
sFile.Close
dFile.Close

run="regedit """ & sPath & """"
rc=wShell.Run(run,,True)
If rc<>0 Then
WScript.Echo "Failed To Run...",rc,vbCRLF,run
WScript.Quit
End If

fso.DeleteFile(sPath)
fso.DeleteFile(dPath)
WScript.Quit

むちゃ さん 2004年 11月 26日 16時 41分 40秒

To:まさ さん
No:121-33

Shell オブジェクトの Exec メソッドは WSH に新しく追加されたものです。
対応バージョンについては下記を参照してください。

http://www.interq.or.jp/student/exeal/dss/ref/wsh/object/wshshell.html#Exec

私も以前 Exec を検証していて、バージョンの依存から使用をやめたこともあります;;

まさ さん 2004年 11月 26日 16時 23分 43秒

タイトル:Execってサポートされていないメソッドなのでしょうか?

某サイトのサンプルコードを使ってPCのIPアドレスを表示しようとしています。

Set objShell = WScript.CreateObject("WScript.Shell")
Set objExec = objShell.Exec("ipconfig.exe")

Do Until objExec.StdOut.AtEndOfStream ' 標準出力が終了するまでループ
strLine = objExec.StdOut.ReadLine ' 1行読み込み
If InStr(strLine, "IP Address") <> 0 Then ' IP Addressが含まれているか?
iColon = Instr(strLine, ":") ' :の位置を調べる
strAddress = Mid(strLine, iColon + 2) ' アドレス部分の切り出し
Wscript.Echo strAddress ' 出力
End If
Loop

というコードなのですが、実行すると
エラー:オブジェクトでサポートされていないプロパティまたはメソッドです。:’objShell.Exec’
とエラー画面が表示されます。
Execメソッドを使うには何か設定がいるのでしょうか?

OSは WINDOWS2000 SP4 です。

むちゃ さん 2004年 11月 25日 13時 48分 32秒

最近、HTML(HTA)上で標準の ActiveX 等を使用して、[ファイルの保存]ダイアログを実現しようと探索しいたところ、ここで、Dialog Helper Object を発見することができました。

色々探してみましたが(MSDN等も) savefiledlg の実行時に既存ファイル以外を指定させる方法って誰かしりませんか???

ファルコ さん 2004年 11月 25日 13時 00分 34秒

訂正
WHS→WSH
ごめんなさい。

ファルコ さん 2004年 11月 25日 12時 59分 28秒

ネットワークの設定を有効(デフォルト)→無効→有効(再起動チック)と出来るようなWHSを調べているのですが、うまくいきません。
2CHから拝借したWHSは、無効のものを有効に、有効のものを無効にするもので、カスタマイズとかしてみたんですが、希望のものになりませんでした。
皆様のお力をお貸しいただけませんでしょうか?

宜しくお願いします。

因みに2CHのWHSは、http://pc5.2ch.net/test/read.cgi/win/1062775949/l50
の>>607 608です。

OS:XP-PRo
用途:無線LANが有効にもかかわらず不通の場合にインターフェイスの再起動として使いたいと思っています。


ばんのしゃーによかばんた さん 2004年 11月 24日 16時 36分 18秒

>ばんのしゃーによかばんた さん 2004年 11月 20日 18時 00分 16秒
>ところで、話変わって、この掲示板をローカルに保存してIEで開くと、
>表示されるまで、白地の時間、なんか遅いんですが、なんででしょう。
>過去記事はそんなことないし。
>初め、サイズが大きいせいかと思ったのですが、切り替わってからも遅い。

デスクトップにあると、遅く、他に移すと、速いようです。変なの。

誰か、IEか、Nortonか、がデスクトップのHTMLファイルは危険だから、
念入りにスキャンしているのかなぁ。

※※※

エクスプローラで「元に戻す」の内容を調べることは出来ないものでしょうかねぇ。
例えば、「移動」を戻すと言っても、ファイル名とか、何処から何処へ
といった情報がないことには、判断の仕様がないではありませんか。

そうへい さん 2004年 11月 24日 01時 38分 46秒

管理人むたぐち さん、ありがとうございました。
無事動きました。

>To: そうへい さん
>> 最後の行にEndがないといっておこられるのですが
>> Else If (str = 1 Or str = 2) Then

>ElseIf ですよー。

ばんのしゃーによかばんた さん 2004年 11月 23日 16時 25分 35秒

>めぐ さん 2004年 11月 23日 11時 10分 29秒
>こんにちは。WIN2000でVBSで下記のようなものを作りたいです。
>いろいろ調べましたが、起動中のプロセスから「taskmgr.exe」を
>探し出すコマンドすらわかりませんでした。

コマンドは、以下。

tlist -p taskmgr.exe

これを使う別解は以下を参照。

>ばんのしゃーによかばんた さん 2004年 03月 21日 17時 56分 08秒
>Windows2000 Support Tools (C:\Program Files\Support Tools にある)の
>TLIST.EXE と KILL.EXE を使う。

>ばんのしゃーによかばんた さん 2004年 04月 12日 18時 47分 27秒
>Windows 2000 Support Toolsのtlist.exeの応用例

ばんのしゃーによかばんた さん 2004年 11月 23日 16時 25分 07秒

>魔界の仮面弁士 さん 2004年 11月 22日 23時 16分 25秒
>提示された「-32768 が Long にされてしまう」という仕様がありますので、
>[2-a]または[3]に、もう少しルールを追加した方が良さそうです。

言葉足らずでしたね。

>Rule[3]
>-32767 〜 32767 は Long と Integer で相互運用(同一視)し、Integer に格納。
>(-32768の間違い)

厳密に書くと、

Rule[3]
-32768 〜 32767 は Long と Integer で相互運用(同一視)し、
-32767 〜 32767 は Integer に格納。
(-32767は間違い。正しくは-32768)
〜 -32768 と 32768 〜 は Long に格納。
(-32768は間違い。正しくは-32769)

※この手の障害は、境界値テストで潰すのが開発のイロハなんですけど、
最近の流行の開発手法では、教えないのかなぁ。

ばんのしゃーによかばんた さん 2004年 11月 23日 14時 12分 12秒

JScript側で、wrapping関数を作り、可変個引数にも対応する。

var SC=new ActiveXObject('ScriptControl');
SC.Language='VBScript';
SC.AddCode('Function f0(f):f0=Eval(f & "()"):End Function:');
SC.AddCode('Function f1(f,p1):f1=Eval(f & "(p1)"):End Function:');
SC.AddCode('Function f2(f,p1,p2):f2=Eval(f & "(p1,p2)"):End Function:');
SC.AddCode('Function f3(f,p1,p2,p3):f3=Eval(f & "(p1,p2,p3)"):End Function:');
function msgbox(p1){
switch(arguments.length){
case 1:return(SC.Run('f1','MsgBox',arguments[0]));break;
case 2:return(SC.Run('f2','MsgBox',arguments[0],arguments[1]));break;
case 3:return(SC.Run('f3','MsgBox',arguments[0],arguments[1],arguments[2]));break;
}
}
msgbox('a');
msgbox('a',2);
msgbox('a',2,'t');


ばんのしゃーによかばんた さん 2004年 11月 23日 14時 11分 45秒

>たくや さん 2004年 11月 17日 16時 15分 19秒
> JavaScriptで値を保存するのに
> WSHでレジストリを読み書きするのではなく、
> WINAPIの
> GetPrivateProfileString
> WritePrivateProfileString
> などを利用して
> 初期ファイルの読み書きができればと考えているのですが、
> 方法があれば教えていただけませんか?

DynaCallの代わりにExcelなどのVBAを使う方法があります。
例えば、

>ばんのしゃーによかばんた さん 2004年 10月 29日 15時 14分 33秒
>ストリーム名を列挙するサンプルです。

※こればっかりで、Excel VBAのエバンジェリストみたい。:-p

魔界の仮面弁士 さん 2004年 11月 23日 12時 33分 33秒

》 めぐ さん
> VBSを走らせると「taskmgr.exe」が起動しているか自動的に調べてくれて
> 「起動しているか、起動していないか」
> その結果を出力してくれる、そんなものが作りたいです。

WMIの『Win32_Process』を使うのが便利かと思います。
googleやMSDNライブラリで調べてみてください。

たとえば、こんな感じでしょうか。

'================================
Option Explicit
Dim Process, Processes, S
S = "SELECT * FROM Win32_Process WHERE Name='taskmgr.exe'"

Set Processes = GetObject("winmgmts:").ExecQuery(S)
If Processes.Count = 0 Then
WScript.Echo "起動されていません。"
Else
S = ""
For Each Process In Processes
S = S & "Name=" & Process.Name & vbCrLf
S = S & "Path=" & Process.ExecutablePath & vbCrLf
S = S & "ProcessId=" & Process.ProcessId
Next
WScript.Echo S
End If

めぐ さん 2004年 11月 23日 11時 10分 29秒

こんにちは。WIN2000でVBSで下記のようなものを作りたいです。

CTR+ALT+DELで出るタスクマネージャに
起動中のプロセスの「イメージ名」てたくさん出ていますよね。
その内の例えば「taskmgr.exe」が起動しているかどうか
VBSで調べたいのです。

VBSを走らせると「taskmgr.exe」が起動しているか自動的に調べてくれて
「起動しているか、起動していないか」
その結果を出力してくれる、そんなものが作りたいです。

いろいろ調べましたが、起動中のプロセスから「taskmgr.exe」を
探し出すコマンドすらわかりませんでした。
お分かりの方いらっしゃいましたらご教授お願いいたします。

say さん 2004年 11月 23日 01時 22分 51秒

う、風邪気味で掲示板見てなかったら面倒くさい解析を皆さんにしていただいてるとわ…
思いもよらなんだ。ありがたや。

知られてることかと思いつつ あまりの理不尽さに書きなぐってしまいましたが
(私のProg.のなかでコメントと内容に違いがある)掲示板が盛り上がって
嬉しいです(単にソースが長いだけかも)。

&h…& なんて表記があったんですね。SDKのヘルプは探しにくくて 一般的な
表記以外のリテラル表現がどこに書いてあるかほとんど分かりませんでしたが
やっぱり書いてなかったんですね。

〉また、Asc()/AscW()がIntegerを返すため、負数に化ける問題も、
〉(Asc(c) And &HFFFF&)
〉とすることで、正数のLongに正規化できます

ありがとうございますっ。これで相当苦しめられてたんです。わたしゃ

Not(Not(VT_I2Var) Or &hffff0000)

としてしのいでたんです。よしよし、これでDynaWrapフォローツールが少し
奇麗になったな。あとエンディアン交換がもっと簡単になれば…(独り言)

きをとりなおして
私の当て推量は 「VARIANT型演算API関数に Unsignとして文字列を丸投げ
してる」んじゃないかというものです。数値文字列から数値に変換する
API関数があるのでここらがキモなのではなかろうか(未調査)。要は Unsignを
無理矢理 Sign しか使えない言語でサポートしようとした「弊害」なのでは
ないか と考えています。まぁ &h…& があるからOK、か?

演算中の VT_I2 → VT_I4 変化を詳しく見ないと VBS→C++ 変換できないので
「いつかは」調べようと思っていたのですが、API関数多いのよねぇ…。ついつい
ちゃんと動きがみえるオートメーションがらみの部分ばかり調べてしまう。最近
また埃をかぶった DynaCall をいじり出したんで、VBS→C++ 変換いったい
いつ出来るのやら。

たらちゃん さん 2004年 11月 22日 23時 37分 06秒

はじめまして。
いきなりの質問で申し訳ないのですが、WSHからExcelを立ち上げて個人用マクロブックのマクロを実行したいのですが、うまくいきません。
もしよろしければ、サンプルコードも示して教えていただけないでしょうか?ちなみにWSHはVBScriptで書いています。
ど素人ですがよろしくお願いします。

魔界の仮面弁士 さん 2004年 11月 22日 23時 16分 25秒

》 ばんのしゃーによかばんた さん
>> Wscript.Echo &H7FFFFFFF&, Hex(&H7FFFFFFF&), TypeName(H7FFFFFFF&)
> &が抜けてます。

あちゃ…。何やってんでしょうかね、私。(^_^;)

という事で、この場合に付いては、
 「2147483647 7FFFFFFF Long」
となり、VBA と同じ結果になるようです。重ね重ね失礼しました。



> Rule[2-a]
> &Hhhhh
> 4桁まではIntegerのバイナリにマップします。
> 5桁以上はLongのバイナリにマップします。

『ばんのしゃーによかばんた さん 2004年 11月 21日 20時 16分 04秒』にて
提示された「-32768 が Long にされてしまう」という仕様がありますので、
[2-a]または[3]に、もう少しルールを追加した方が良さそうです。


&H8001, &H7FFF は 4桁以下であり、Integer となりますが、
&H8000 は 4桁以下であるにも関わらず、Long となります。


以下、4桁ヘキサに対する実験。

Wscript.Echo "========= CIntで変換 ========="
'[7FFF] [+32767] [Integer]
Wscript.Echo Hex(CInt(&H7FFF)), CInt(&H7FFF), TypeName(CInt(&H7FFF))
'[8000] [-32767] [Integer]
Wscript.Echo Hex(CInt(&H8000)), CInt(&H8000), TypeName(CInt(&H8000))
'[8001] [-32767] [Integer]
Wscript.Echo Hex(CInt(&H8001)), CInt(&H8001), TypeName(CInt(&H8001))

Wscript.Echo "========= 末尾に & を追加 ========="
'[7FFF] [+32767] [Integer]
Wscript.Echo Hex(&H7FFF&), &H7FFF&, TypeName(&H7FFF&)
'[8000] [+32768] [Long]
Wscript.Echo Hex(&H8000&), &H8000&, TypeName(&H8000&)
'[8001] [+32769] [Long]
Wscript.Echo Hex(&H8001&), &H8001&, TypeName(&H8001&)

Wscript.Echo "========= CInt と & を併用 ========="
'[7FFF] [+32767] [Integer]
Wscript.Echo Hex(CInt(&H7FFF&)), CInt(&H7FFF&), TypeName(CInt(&H7FFF&))
'32768 は Integer の範囲を超えるので、overflow
'Wscript.Echo Hex(CInt(&H8000&)), CInt(&H8000&), TypeName(CInt(&H8000&))
'32769 は Integer の範囲を超えるので、overflow
'Wscript.Echo Hex(CInt(&H8001&)), CInt(&H8001&), TypeName(CInt(&H8001&))

ばんのしゃーによかばんた さん 2004年 11月 22日 19時 50分 28秒

>魔界の仮面弁士 さん 2004年 11月 22日 18時 26分 57秒
>'''★ for VBScript ★
>'255 FF Integer
>Wscript.Echo &HFF , Hex(&HFF ), TypeName(&HFF )
>'255 FF Integer
>Wscript.Echo &HFF&, Hex(&HFF&), TypeName(&HFF&)

Rule[3]ですね。

>'''★ for VBScript ★
>'2147483647 7FFFFFFF Long
>Wscript.Echo &H7FFFFFFF , Hex(&H7FFFFFFF ), TypeName(&H7FFFFFFF )
>'(コンパイルエラー)
>Wscript.Echo &H7FFFFFFF&, Hex(&H7FFFFFFF&), TypeName(H7FFFFFFF&)

変ですね。

wscript.echo &h7fffffff,hex(&h7fffffff)
'2147483647 7FFFFFFF
wscript.echo &h7fffffff&,hex(&h7fffffff&)
'2147483647 7FFFFFFF
wscript.echo &h80000000,hex(&h80000000)
'-2147483648 80000000
wscript.echo &h80000000&,hex(&h80000000&)
'-2147483648 80000000
wscript.echo &hffffffff,hex(&hffffffff)
'-1 FFFF
wscript.echo &hffffffff&,hex(&hffffffff&)
'-1 FFFF

問題ないようですが。

>Wscript.Echo &H7FFFFFFF&, Hex(&H7FFFFFFF&), TypeName(H7FFFFFFF&)

&が抜けてます。

ばんのしゃーによかばんた さん 2004年 11月 22日 19時 02分 21秒

解説

&H〜と書いたとき、それが実際にどういう値になるのか、分からないのでは、
とても使えません。そこで、どういう規則性があるのか、考えてみました。
当て推量で書いてます。

Rule[1]から[3]を順次適用します。

Rule[1-a]
&H0000hhhh
の先行する0は無視されます。
&Hhhhh
と同じです。

Rule[1-b]
&Hhhhh&
は8桁まで先行する0を補います。
&H0000hhhh&
と同じです。

Rule[2-a]
&Hhhhh
4桁まではIntegerのバイナリにマップします。
5桁以上はLongのバイナリにマップします。

Rule[2-b]
&Hhhhh&
Longのバイナリにマップします。

Rule[3]
-32767 〜 32767 は Long と Integer で相互運用(同一視)し、Integer に格納。
(-32768の間違い)


魔界の仮面弁士 さん 2004年 11月 22日 18時 26分 57秒

》ばんのしゃーによかばんた さん
> wscript.echo &h8000,hex(&h8000)
> '-32768 FFFF8000
> wscript.echo &h8000&,hex(&h8000&)
> '32768 8000

あ。その手法自体は、恐らく問題無いと思います。
誤解を招く表現で申し訳ありません。

私の発言は、値ではなく、「型」に着目した内容です。(TypeName関数で調査)



>> のようにLongの型宣言文字の&を末尾に付けるとよいようです。

この場合の & は、VBAでいうところの「長整数型の型宣言文字」ではありません。


'''★ for VBScript ★
'-1 FFFF Integer
Wscript.Echo &HFFFF , Hex(&HFFFF ), TypeName(&HFFFF )
'65535 FFFF Long
Wscript.Echo &HFFFF&, Hex(&HFFFF&), TypeName(&HFFFF&)

'''☆ for VBA ☆
'-1 FFFF Integer
Debug.Print &HFFFF , Hex(&HFFFF ), TypeName(&HFFFF )
'65535 FFFF Long
Debug.Print &HFFFF&, Hex(&HFFFF&), TypeName(&HFFFF&)


という結果だけを見ると、& が(VBAでいうところの)型宣言文字と
同じように動作しているように見えますが、値によっては、

'''★ for VBScript ★
'255 FF Integer
Wscript.Echo &HFF , Hex(&HFF ), TypeName(&HFF )
'255 FF Integer
Wscript.Echo &HFF&, Hex(&HFF&), TypeName(&HFF&)

'''☆ for VBA ☆
'255 FF Integer
Debug.Print &HFF , Hex(&HFF ), TypeName(&HFF )
'255 FF Long
Debug.Print &HFF&, Hex(&HFF&), TypeName(&HFF&)


ですとか、


'''★ for VBScript ★
'2147483647 7FFFFFFF Long
Wscript.Echo &H7FFFFFFF , Hex(&H7FFFFFFF ), TypeName(&H7FFFFFFF )
'(コンパイルエラー)
Wscript.Echo &H7FFFFFFF&, Hex(&H7FFFFFFF&), TypeName(H7FFFFFFF&)

'''☆ for VBA ☆
'2147483647 7FFFFFFF Long
Debug.Print &H7FFFFFFF , Hex(&H7FFFFFFF ), TypeName(&H7FFFFFFF )
'2147483647 7FFFFFFF Long
Debug.Print &H7FFFFFFF&, Hex(&H7FFFFFFF&), TypeName(H7FFFFFFF&)


のような動作をするため、この場合の & は型宣言文字ではない、と判断した次第です。

ばんのしゃーによかばんた さん 2004年 11月 22日 16時 25分 57秒

&H〜&を使うことで、ANKの分類が簡単にできます。

Select Case (Asc(c) And &HFF80&)
Case 0 WScript.Echo c,"ASCII"
Case &H80 WScript.Echo c,"Katakana"
Case Else WScript.Echo c,"Zenkaku"
End Select

また、Asc()/AscW()がIntegerを返すため、負数に化ける問題も、
(Asc(c) And &HFFFF&)
とすることで、正数のLongに正規化できます。

勿論、&H〜&を使わなくても、10進数の
65408
65535
32768
などを使えば、同じことができますが、可読性が。

そこは、せめて、Constを使って欲しいところですね。
Const xFF80=65408
Const xFF00=65535
Const x8000=32768
など。

※しかし、&H〜&のことはVBScriptのヘルプにちゃんと書いといてほしいもんです。

ばんのしゃーによかばんた さん 2004年 11月 22日 16時 25分 30秒

>魔界の仮面弁士 さん 2004年 11月 22日 10時 36分 32秒
>それは VBS ではなく、VBA の場合ですよね。
>(VBScript では、型宣言文字はサポートされていませんし…)
>一応、16進数表記 や 8進数表記においては、最後に & を付ける事が
>許されていますが、型指定としての意味は無いようです。

それが、どっこい、

wscript.echo &h8000,hex(&h8000)
'-32768 FFFF8000
wscript.echo &h8000&,hex(&h8000&)
'32768 8000
wscript.echo &h00008000,hex(&h00008000)
'-32768 FFFF8000
wscript.echo &h00008000&,hex(&h00008000&)
'32768 8000
wscript.echo &hffff8000,hex(&hffff8000)
'-32768 FFFF8000
wscript.echo &hffff8000&,hex(&hffff8000&)
'-32768 FFFF8000

wscript.echo &h8001,hex(&h8001)
'-32767 8001
wscript.echo &h8001&,hex(&h8001&)
'32769 8001
wscript.echo &h00008001,hex(&h00008001)
'-32767 8001
wscript.echo &h00008001&,hex(&h00008001&)
'32769 8001
wscript.echo &hffff8001,hex(&hffff8001)
'-32767 8001
wscript.echo &hffff8001&,hex(&hffff8001&)
'-32767 8001

wscript.echo &hffff,hex(&hffff)
'-1 FFFF
wscript.echo &hffff&,hex(&hffff&)
'65535 FFFF
wscript.echo &h0000ffff,hex(&h0000ffff)
'-1 FFFF
wscript.echo &h0000ffff&,hex(&h0000ffff&)
'65535 FFFF
wscript.echo &hffffffff,hex(&hffffffff)
'-1 FFFF
wscript.echo &hffffffff&,hex(&hffffffff&)
'-1 FFFF

なので、やはり、

>> 16進整数リテラルで、このようなトラブルを避けるには、
>> &H8000&
>> のようにLongの型宣言文字の&を末尾に付けるとよいようです。
>> 16進整数リテラルは&H〜でなく、&H〜&と覚えておけば、安全かな。

ですね。

ばんのしゃーによかばんた さん 2004年 11月 22日 14時 49分 03秒

>ばんのしゃーによかばんた さん 2004年 11月 19日 15時 58分 49秒
>VBScriptのMsgBoxなどの関数をTLBINF32などを使って、
>dispid(?)指定で呼び出すことはできないでしょうか。

出来ないようなので、別の方法を考案。

JScriptから、ScriptControl経由でVBScriptの関数を汎用的に呼び出す方法。
引数の数別にプロトタイプを用意して、関数名を第一引数で与えます。

var SC=new ActiveXObject('ScriptControl');
SC.Language='VBScript';
SC.AddCode('Function f1(f,p1):f1=Eval(f & "(p1)"):End Function:');
SC.AddCode('Function f2(f,p1,p2):f2=Eval(f & "(p1,p2)"):End Function:');
SC.AddCode('Function f3(f,p1,p2,p3):f3=Eval(f & "(p1,p2,p3)"):End Function:');
var s=SC.Run('f1','InputBox','Enter');
s=SC.Run('f3','MsgBox',s,1,'title');
//または、
var vbs=SC.CodeObject;
vbs.f3('MsgBox',s,1,'title');

エル さん 2004年 11月 22日 13時 46分 57秒

以前に何度かお世話になりました。
今回また質問がありこちらに来させていただきました、よろしくお願いします。
質問なのですが、
@<input type="file" name="file" value="">
A<input type="text" name="text" value="">
のようなhtmlがあった場合、
@document.form1.file.Value="aaaa"
Adocument.form1.text.Value="bbbb"
上記のような2つのVBSのうちAは可能ですが、@のようにタイプがfileの場合は、
どうあがいても値のセットは無理なのでしょうか?
(セキュリティ上の仕様だということなのでしょうか?)
何か良い方法があればお願いいたします。

魔界の仮面弁士 さん 2004年 11月 22日 10時 36分 32秒

》 ばんのしゃーによかばんた さん
> 16進整数リテラルで、このようなトラブルを避けるには、
> &H8000&
> のようにLongの型宣言文字の&を末尾に付けるとよいようです。
> 16進整数リテラルは&H〜でなく、&H〜&と覚えておけば、安全かな。

それは VBS ではなく、VBA の場合ですよね。
(VBScript では、型宣言文字はサポートされていませんし…)

一応、16進数表記 や 8進数表記においては、最後に & を付ける事が
許されていますが、型指定としての意味は無いようです。

'' for VBScript 5.6
MsgBox TypeName(&H8000 ) 'Long
MsgBox TypeName(&H8000& ) 'Long
MsgBox TypeName(&H800& ) 'Integer
MsgBox TypeName(&H800 ) 'Integer

MsgBox TypeName(&100000 ) 'Long
MsgBox TypeName(&100000& ) 'Long
MsgBox TypeName(&10000& ) 'Integer
MsgBox TypeName(&10000 ) 'Integer

ばんのしゃーによかばんた さん 2004年 11月 21日 20時 16分 04秒

>say さん 2004年 11月 20日 12時 18分 56秒
>VBSの16進定数の扱いが変なところ

正しくは、-32768 〜 32767 を Integer にすべきところ、
判定を誤って、-32767 〜 32767 だけを Integer にして、
-32768 は Long にしているようですね。

本来なら、符号なし整数にしたい16進整数リテラルを符号付き整数で
扱うわけですから、なるべく符号ビットの使用を避けたほうがよいのかも。

16進整数リテラルで、このようなトラブルを避けるには、
&H8000&
のようにLongの型宣言文字の&を末尾に付けるとよいようです。

16進整数リテラルは&H〜でなく、&H〜&と覚えておけば、安全かな。

管理人むたぐち さん 2004年 11月 21日 13時 31分 07秒

To: そうへい さん

> 最後の行にEndがないといっておこられるのですが

> Else If (str = 1 Or str = 2) Then

ElseIf ですよー。


To: ばんのしゃーによかばんた さん

WinXPなので、それは当てはまらないような気がします。
なんにせよ、記憶領域が不足、とか言われても意味不明なので
困りますよね。

ばんのしゃーによかばんた さん 2004年 11月 20日 18時 00分 16秒

>管理人むたぐち さん 2004年 11月 19日 23時 04分 56秒
>AnHTTPDで*.vbsを*.cgiにリネームしても実行できない件ですが、
>CGIの動作アカウントをちゃんと設定してもやっぱり駄目でした。
>他の理由があるのかもしれません。

なんか、状況的?に、以下が参考になりませんか?
そのものは修正済とかで関係ないんでしょうが。

――――――――――――――――――――――――――――――――――――――
サポート技術情報

ACE を削除した後、仮想ディレクトリのプロパティを参照すると "十分な記憶域がありません" というエラー メッセージが表示される
文書番号: JP292776
最終更新日: 04-24-2001
--------------------------------------------------------------------------------
この資料は以下の製品について記述したものです。
Microsoft Windows 2000, 2000 SP1 Professional
Microsoft Windows 2000, 2000 SP1 Server
Microsoft Windows 2000, 2000 SP1 Advanced Server
--------------------------------------------------------------------------------
現象
NNTP (Network News Transfer Protocol) を使用するサーバーで、アクセス制御エントリ (ACE) を削除した後、ESM (Exchange System Manager) を使用して仮想ディレクトリのプロパティを参照しようとすると、次のエラー メッセージが表示されます。
"この操作を完了するのに十分な記憶域がありません。"
原因
この現象は、ACE を削除した後、Nntpsvc/仮想サーバー ID に、有効なアカウントに割り当てることができないセキュリティ ID (SID) があるために発生します。
回避策
この現象を回避するには、ESM またはアクセス制御リスト (ACL) エディタを使用して、無効な SID エントリを手動で削除します。
状況
Windows 2000
この問題を解決するためのモジュールは、Windows 2000 日本語版 Service Pack 2 以降に含まれております。
Windows 2000 日本語版の最新 Service Pack については、以下 Web サイトから入手できます。
http://support.microsoft.com/intl/japan/support/servicepacks/win2ksp.asp?sp=2
関連情報
この資料は米国 Microsoft Corporation から提供されている Knowledge Base の Article ID Q292776 (最終更新日 2001-04-24) をもとに作成したものです。
:
Keywords:: kberrmsg kbpolicy kbWin2000x
Issue Type: kbbug
Technology: kbwin2000AdvServSearch kbwin2000Ssearch kbwin2000ProSearch kbWinAdvServSearch kbWin2000AdvServSP1
--------------------------------------------------------------------------------

>batなど他の言語でも検討してから、AnHTTPDコミュの方に
>問い合わせてみます。

そうですね。例えば、
#! C:\Windows\System32\MORE.COM
とかすれば、ちゃんと読めているかどうか、分かりますね。

――――――――――――――――――――――――――――――――――――――
ところで、話変わって、この掲示板をローカルに保存してIEで開くと、
表示されるまで、白地の時間、なんか遅いんですが、なんででしょう。
過去記事はそんなことないし。
初め、サイズが大きいせいかと思ったのですが、切り替わってからも遅い。

ばんのしゃーによかばんた さん 2004年 11月 20日 14時 39分 08秒

改版

dictionaryはひとつに。

collect.wsc
――――――――――――――――――――――――――――――――――――――
<?xml version="1.0" encoding="UTF-8"?><package>
<component>
<public>
<method name="Item" dispid="0" />
<method name="_NewEnum" dispid="-4" />
<method name="Add" />
<property name="Count" />
</public>
<script language="VBScript"><![CDATA[

Option Explicit
Private dic
Public Count
Set dic=CreateObject("Scripting.Dictionary")
Count=0

Public Sub Add(value)
dic.Add Value,Count
Count=Count+1
End Sub

Public Function Item(ind)
Item=dic.Keys()(ind)
End Function

Public Function [_NewEnum]()
[_NewEnum]=dic.[_NewEnum]
End Function

']]></script>
</component>
</package>


ばんのしゃーによかばんた さん 2004年 11月 20日 14時 38分 22秒

>魔界の仮面弁士 さん 2004年 11月 19日 15時 42分 18秒

私の提案したインデント表記法は、正しくは、

Function Proc()
: Do
: : A = "あ"
: Loop
End Function

のように「:」と空白ひとつを組みで使います。

「::」は他の表記に誤解されやすいですから。

そうへい さん 2004年 11月 20日 13時 17分 07秒

以下のスクリプトを動かそうとすると
最後の行にEndがないといっておこられるのですが
どうしてなのでしょうか?

Set fs = WScript.CreateObject("Scripting.FileSystemObject")

Dim str
str=InputBox ("1 : aaa 2 : bbb")

If (str = null) Then
MsgBox("何か選んでよ")
Else If (str = 1 Or str = 2) Then
If (fs.FolderExists(".\zzz)) Then
fs.DeleteFolder(".\zzz")
End If

Set folder = fs.GetFolder(".")

Select Case str
Case 1
Case 2
End Select
Else
MsgBox("値が有効範囲を超えています")
End If

say さん 2004年 11月 20日 12時 18分 56秒

VBSの16進定数の扱いが変なところ

' 16進定数の代入
i=32767
msgbox hex(i) ' &h7FFF
msgbox vartype(i) ' 2:VT_I2
i=&h7fff
msgbox hex(i) ' &h7FFF
msgbox vartype(i) ' 2:VT_I2

i=32768
msgbox hex(i) ' &h8000
msgbox vartype(i) ' 3:VT_I4
i=&h8000
msgbox hex(i) ' &hFFFF8000 <- 気持ちは分かるが普通の
msgbox vartype(i) ' 3:VT_I4 ユーザーはこう思わないのでわ?

i=32769
msgbox hex(i) ' &h8001
msgbox vartype(i) ' 3:VT_I4
i=&h8001
msgbox hex(i) ' &h8001
msgbox vartype(i) ' 2:VT_I2


' 見かけだけ2バイト同士のビット演算
j=&h7fff
msgbox hex(j) ' &h7FFF
msgbox vartype(j) ' 2:VT_I2

i=&h7fff
k=i or j
msgbox hex(k) ' &h7FFF
msgbox vartype(k) ' 2:VT_I2

i=&h8000
k=i or j
msgbox hex(k) ' &hFFFFFFFF
msgbox vartype(k) ' 3:VT_I4

i=&h8001
k=i or j
msgbox hex(k) ' &hFFFF
msgbox vartype(k) ' 2:VT_I2

' 見かけだけ4バイトと2バイトのビット演算
j=&h10000
msgbox hex(j) ' &h10000
msgbox vartype(j) ' 3:VT_I4

i=&h7fff
k=i or j
msgbox hex(k) ' &h00017FFF
msgbox vartype(k) ' 3:VT_I4

i=&h8000
k=i or j
msgbox hex(k) ' &hFFFF8000
msgbox vartype(k) ' 3:VT_I4

i=&h8001
k=i or j
msgbox hex(k) ' &hFFFF8001 <-2バイト側の符号拡張
msgbox vartype(k) ' 3:VT_I4

知らないでビット演算すると悲惨です。
定数表記だけでは&h8000は代入不可能なのね。


管理人むたぐち さん 2004年 11月 19日 23時 04分 56秒

あ、言い忘れてましたが、
AnHTTPDで*.vbsを*.cgiにリネームしても実行できない件ですが、
CGIの動作アカウントをちゃんと設定してもやっぱり駄目でした。
他の理由があるのかもしれません。

batなど他の言語でも検討してから、AnHTTPDコミュの方に
問い合わせてみます。

管理人むたぐち さん 2004年 11月 19日 22時 09分 31秒

前ページの返信です。
http://www.roy.hi-ho.ne.jp/mutaguchi/bbs/list120.shtml

To: たんぼ さん

> MSDNを参考にやってみたのですが、駄目でした。
> すみませんが、どこか間違いがあったら教えていただけないでしょうか?

あれ、こちらで試してみたところ同じく駄目でした。
エラーは出ないんですが、削除されません。

すみません、ちょっと原因が分からないです。
分かる方、フォロー願います。


To: ばんのしゃーによかばんた さん 2004年 11月 18日 19時 49分 56秒

> 11 って0011 ナポレオンソロの11? ※そればっかり。

ただ、初代スレで11番目にレスしたというだけの理由で、
スレが変わるたびに毎回11取りをしてたんですよw
今のところ、4勝2敗くらいです。(関連スレでもやってましたので)


To: 魔界の仮面弁士 さん

> この掲示板では、空白やタブが潰れてしまうため、インデントの
> 替わりに利用しています。JScriptなら ; ですかね。
>
> (この方法を使いだした載って、ばんのしゃーによかばんたさんでしたっけ?)

そうですね。
私がいつまでも改善しないため、ご迷惑をおかけしております。
Hi-HOにスクリプト改変の許可を貰ったりなんだりで、面倒でして、その。
MVPの名が泣きますね、これじゃ。いずれ何とかします。


To: ばんのしゃーによかばんた さん 2004年 11月 19日 15時 59分 40秒

> VBScriptでCollection

おおお、すばらしぃ〜!
理論通りに動くと感動しますね。

理論を固めると、実証するのが面倒で(というか忘れて)他人に任せてしまうのが
私の悪い癖です。ばんのしゃーによかばんたさん、ありがとうございました。

たんぼ さん 2004年 11月 19日 17時 22分 18秒

すみません、解決しました。考えてくださった皆さんありがとうございました。

Return