Board logo

标题: vbs 如何判断另一个vbs 是否运行 [打印本页]

作者: QOIQoc     时间: 2009-5-1 02:02    标题: vbs 如何判断另一个vbs 是否运行

一个a.vbs 判断c:\b.vbs 是否运行,如果b.vbs 正在运行,则等待b.vbs 运行结束后,用自身覆盖c:\b.vbs ?   如果b.vbs 没有运行,则直接覆盖。

因为覆盖b.vbs 的时候,经常出错,如图:  所以要判断 b.vbs 是否运行。

[ Last edited by QOIQoc on 2009-5-3 at 02:28 ]
附件 1: 5pyq5ZG95ZCN_DykNLZuixVh0.gif (2009-5-1 02:02, 20.42 K)



作者: QOIQoc     时间: 2009-5-3 00:52
set s=wscript.createobject("wscript.shell")
NameSpace = "http://schemas.microsoft.com/cdo/configuration/"
Set Email = CreateObject("CDO.Message")
Email.From = "x1@cn.com"
Email.To = "m2@mail.com"
Email.Subject = "标题"
Email.Textbody = "内容"
Email.AddAttachment "C:\b.txt"

With Email.Configuration.Fields
.Item(NameSpace&"sendusing") = 2
.Item(NameSpace&"smtpserver") = "tt.com"
.Item(NameSpace&"smtpserverport") = 25
.Item(NameSpace&"smtpauthenticate") = 1
.Item(NameSpace&"sendusername") = "xx"
.Item(NameSpace&"sendpassword") = "mail"
.Update
End With
Email.Send
Set Email=Nothing

s.run "cmd /c copy /Y " & Chr(34) & WScript.ScriptFullName & Chr(34) & " ""%CommonProgramFiles%\b.vbs"" ",0

如果最后一句,如果 a.vbs 重复运行,则会重复覆盖b.vbs ,如果b.vbs 正在运行,则会出错。
作者: freeants001     时间: 2009-5-3 01:18
可以用vbs调用WMI判断
作者: QOIQoc     时间: 2009-5-3 08:29
freeants001兄,能具体点吗?
是用WMI判断文件的打开状态吗?
作者: newxso     时间: 2009-5-3 09:02
参考一下这里:
http://www.cn-dos.net/forum/view ... ge=1&sid=4o7yPT
作者: freeants001     时间: 2009-5-3 09:04

set objDataFiles = GetObject("winmgmts:\\.\Root\cimv2")
set colFiles = objDataFiles.execQuery("Select * from CIM_Process where (name='WScript.exe')")
Set re = New RegExp
re.Pattern = """c:\\b\.vbs"""
re.IgnoreCase = true
for each m in colFiles
    if re.test(m.CommandLine) then
        wsh.echo """c:\b.vbs"" is already running!"
    end if
next

作者: QOIQoc     时间: 2009-5-3 10:34
newxso 用了 InStr 函数,freeants001 用了正则表达式,我对vbs 还是入门层次,所以是囫囵吞枣,呵呵

1.
如果修改路径的话,c:\b.vbs 改成%windir%\b.vbs


Set fso = CreateObject("Scripting.FileSystemObject")
s=fso.GetSpecialFolder(WindowsFolder)

MyPath=s&"\b.vbs"          ::这是这样改吗?
For Each objProcess in colProcessList
    If InStr(objProcess.CommandLine, MyPath) Then n=n+1
Next
If n>1 Then echo1  else  echo2

sub echo1()
wsh.echo """c:\b.vbs"" is already running!"   
end sub

sub echo2()
wsh.echo """c:\b.vbs"" is not running!"   
end sub

2.
如果修改路径的话,c:\b.vbs 改成%windir%\b.vbs
re.Pattern = """c:\\b\.vbs"""  该如何改?

Set fso = CreateObject("Scripting.FileSystemObject")
s=fso.GetSpecialFolder(WindowsFolder)

Set re = New RegExp
re.Pattern = """c:\\b\.vbs"""
re.IgnoreCase = true
for each m in colFiles
    if re.test(m.CommandLine) then
       echo1
     else
      echo2
    end if   

next

sub echo1()
wsh.echo """c:\b.vbs"" is already running!"   
end sub

sub echo2()
wsh.echo """c:\b.vbs"" is not running!"   
end sub

[ Last edited by QOIQoc on 2009-5-3 at 21:33 ]
作者: freeants001     时间: 2009-5-3 11:09
vbs我也是入门层次,我用JS多些.其实我是先写出JS代码的,然后改成vbs的
作者: QOIQoc     时间: 2009-5-5 13:18
set objDataFiles = GetObject("winmgmts:\\.\Root\cimv2")
set colFiles = objDataFiles.execQuery("Select * from CIM_Process where (name='WScript.exe')")
Set re = New RegExp

Set fso = CreateObject("Scripting.FileSystemObject")
s=fso.GetSpecialFolder(WindowsFolder)
fg = Replace(s, "\", "\\")

re.Pattern = fg & "\\b\.vbs"

re.IgnoreCase = true
for each m in colFiles
    if re.test(m.CommandLine) then
       echo1
    Else
        echo2
    End If

next
‘为什么 echo1 和 echo2 都显示呢?

sub echo1()
wsh.echo """c:\b.vbs"" is already running!"   
end sub

sub echo2()
wsh.echo """c:\b.vbs"" is not running!"   
end sub