标题: [技术讨论] VBS自定义CMD命令函数 [打印本页]
作者: yu2n 时间: 2012-11-2 23:15 标题: VBS自定义CMD命令函数
本帖最后由 yu2n 于 2012-12-17 00:04 编辑
直接上代码,欢迎加强。
:) 更新:2012-12-16 写了一个公共函数,方便新手使用。请点击 这里 (本栋6楼)查看完整文档。
' ====================================================================================================
' ****************************************************************************************************
' * + 公共函数
' * - 使用方式:将本段"所有"代码置于程序任意位置,将以下代码(2行,以注释“REM”开头)加入程序首行即可:
REM Dim WhoAmI, TmpDir, WinDir, AppDataDir, StartupDir, MeDir, MeName, MePid, UNCHost
REM Call GetGloVar() ' 获得全局变量
' * - 发电邮获得支持:[email]yu2n@qq.com[/email]
' * - 第 0007 次更新:2012-12-15 17:14
' ****************************************************************************************************
' 功能索引
' 命令行支持:
' 检测环境:IsCmdMode是否在CMD下运行
' 模拟命令:Exist是否存在文件或文件夹、MD创建目录、Copy复制文件或文件夹、Del删除文件或文件夹、
' Attrib更改文件或文件夹属性、Ping检测网络联通、
' 对话框:
' 提示消息:WarningInfo警告消息、TipInfo提示消息、ErrorInfo错误消息
' 输入密码:GetPassword提示输入密码、
' 文件系统:
' 复制、删除、更改属性:参考“命令行支持”。
' INI文件处理:读写INI文件(Unicode) ReadIniUnicode / WriteIniUnicode
' 注册表处理:RegRead读注册表、RegWrite写注册表
' 日志处理:WriteLog写文本日志
' 字符串处理:
' 提取:RegExpTest
' 程序:
' 检测:IsRun是否运行、MeIsAlreadyRun本程序是否执行、、、、
' 执行:Run前台等待执行、RunHide隐藏等待执行、RunNotWait前台不等待执行、RunHideNotWait后台不等待执行、
' 加密运行:MeEncoder
' 系统:
' 版本
' 延时:Sleep
' 发送按键:SendKeys
' 网络:
' 检测:Ping、参考“命令行支持”。
' 连接:文件共享、、、、、、、、、、
' 时间:Format_Time格式化时间、NowDateTime当前时间
' ====================================================================================================
' ====================================================================================================
MD命令,vbs-plkj改进算法,vbs-yu2n加入UNC路径支持。
更新2次:08:49 2012.11.03- '作者:vbs-plkj | vbs-yu2n
- '使用:Call MD("D:\a\b\c\d\e\f\g\h")
- ' Call MD("\\PCName\Share$\a\b\c\d\e\f\g\h\")
- Sub MD(ByVal strPath)
- Set fso = CreateObject("Scripting.FileSystemObject")
- Dim arrPath, strTemp, valStart
- arrPath = Split(strPath, "\")
- If Left(strPath, 2) = "\\" Then ' UNC Path
- valStart = 3
- strTemp = arrPath(0) & "\" & arrPath(1) & "\" & arrPath(2)
- Else ' Local Path
- valStart = 1
- strTemp = arrPath(0)
- End If
- For i = valStart To UBound(arrPath)
- strTemp = strTemp & "\" & arrPath(i)
- WScript.Echo strTemp
- If Not fso.FolderExists( strTemp ) Then fso.CreateFolder( strTemp )
- Next
- Set fso = Nothing
- End Sub
复制代码
Attrib 支持 [+R | -R] [+A | -A ] [+S | -S] [+H | -H] 参数
更新3次:19:49 2012.11.03- Sub Attrib(strPath, strArgs) 'strArgs = [+R | -R] [+A | -A ] [+S | -S] [+H | -H]
- Dim fso, valAttrib, arrAttrib()
- Set fso = CreateObject("Scripting.FileSystemObject")
- If (fso.FileExists(strPath)) Then valAttrib = fso.getFile(strPath).attributes
- If (fso.FolderExists(strPath)) Then valAttrib = fso.getFolder(strPath).attributes
- If valAttrib = "" Or strArgs = "" Then Exit Sub
- binAttrib = DecToBin(valAttrib) ' 十进制转二进制
- For i = 0 To 16 ' 二进制转16位二进制
- ReDim Preserve arrAttrib(i)
- arrAttrib(i) = 0
- If i > 16 - Len(binAttrib) Then arrAttrib(i) = Mid(binAttrib, i - (16 - Len(binAttrib)), 1)
- Next
- If Instr(1, LCase(strArgs), "+r", 1) Then arrAttrib(16 - 0) = 1 'ReadOnly 1
- If Instr(1, LCase(strArgs), "-r", 1) Then arrAttrib(16 - 0) = 0
- If Instr(1, LCase(strArgs), "+h", 1) Then arrAttrib(16 - 1) = 1 'Hidden 2
- If Instr(1, LCase(strArgs), "-h", 1) Then arrAttrib(16 - 1) = 0
- If Instr(1, LCase(strArgs), "+s", 1) Then arrAttrib(16 - 2) = 1 'System 4
- If Instr(1, LCase(strArgs), "-s", 1) Then arrAttrib(16 - 2) = 0
- If Instr(1, LCase(strArgs), "+a", 1) Then arrAttrib(16 - 5) = 1 'Archive 32
- If Instr(1, LCase(strArgs), "-a", 1) Then arrAttrib(16 - 5) = 0
- valAttrib = BinToDec(Join(arrAttrib,"")) ' 二进制转十进制
- If (fso.FileExists(strPath)) Then fso.getFile( strPath ).attributes = valAttrib
- If (fso.FolderExists(strPath)) Then fso.getFolder( strPath ).attributes = valAttrib
- Set fso = Nothing
- End Sub
- Function DecToBin(ByVal number)
- Dim remainder
- remainder = number
- Do While remainder > 0
- DecToBin = CStr(remainder mod 2) & DecToBin
- remainder = remainder \ 2
- Loop
- End Function
- Function BinToDec(ByVal binStr)
- Dim i
- For i = 1 to Len(binStr)
- BinToDec = BinToDec + (CInt(Mid(binStr, i, 1)) * (2 ^ (Len(binStr) - i)))
- Next
- End Function
复制代码
更新1次:22:40 2012/11/5- Sub Copy( ByVal strSource, ByVal strDestination )
- On Error Resume Next ' Required 必选
- Set fso = CreateObject("Scripting.FileSystemObject")
- ' 如果来源是一个文件
- If (fso.FileExists(strSource)) Then
- ' 如果目的地是一个文件夹,加上路径后缀反斜线“\”
- If (fso.FolderExists(strDestination)) Then
- fso.CopyFile fso.GetFile(strSource).Path, fso.GetFolder(strDestination).Path & "\", True
- Else
- ' 如果目的地是一个文件,直接复制
- fso.CopyFile fso.GetFile(strSource).Path, strDestination, True
- End If
- End If
- ' 如果来源是一个文件夹
- If (fso.FolderExists(strSource)) Then fso.CopyFolder fso.GetFolder(strSource).Path, fso.GetFolder(strDestination).Path, True
- Set fso = Nothing
- End Sub
复制代码
- '===========================================================================================
- '类CMD命令
- Sub Echo( strOutput )
- If Not IsCmdMode Then Exit Sub
- If strOutput = "" Or strOutput = VbCrLf Then
- WScript.Echo VbCrLf
- Else
- WScript.Echo strOutput
- End If
- End Sub
- Function Pause(msg) '暂停函数
- If Not IsCmdMode Then Exit Function
- WScript.Echo ""
- WScript.Echo msg
- WScript.StdIn.ReadLine
- End Function
- Function ReadInput( enquiryStr ) ' 读取输入,相当于Set/p p=
- If Not IsCmdMode Then Exit Function
- WScript.StdOut.Write enquiryStr
- ReadInput = Trim( WScript.StdIn.ReadLine )
- End Function
- Function Exist( strPath )
- Set fso = CreateObject("Scripting.FileSystemObject")
- If ((fso.FolderExists( strPath )) Or (fso.FileExists( strPath ))) then
- Exist = True
- Else
- Exist = False
- End if
- Set fso = Nothing
- End Function
- Sub MD( strPath )
- Set fso = CreateObject("Scripting.FileSystemObject")
- If Not fso.FolderExists( strPath ) Then
- fso.CreateFolder( strPath )
- End If
- Set fso = Nothing
- End Sub
- Sub Copy( strSource, strDestination )
- On Error Resume Next
- If Exist( strSource ) Then
- Set fso = CreateObject("Scripting.FileSystemObject")
- If (fso.FileExists(strSource)) Then fso.CopyFile strSource, strDestination, True ' 源文件 - 目标文件
- If (fso.FolderExists(strSource)) Then fso.CopyFolder strSource, strDestination, True
- Set fso = Nothing
- Else
- WarningInfo "警告", "找不到 " & strSource & " 文件!", 2
- End If
- End Sub
- Sub Del( strPath )
- On Error Resume Next
- If Exist( strPath ) Then
- Set fso = CreateObject("Scripting.FileSystemObject")
- If (fso.FileExists(strPath)) Then
- fso.getFile( strPath ).attributes=0
- fso.getFile( strPath ).delete
- End If
- If (fso.FolderExists(strPath)) Then
- fso.getFolder( strPath ).attributes=0
- fso.getFolder( strPath ).delete
- End If
- Set fso = Nothing
- End If
- End Sub
- Sub Attrib( strPath, valAttrib )
- 'ReadOnly:1 只读文件。可读写。 'Hidden:2 隐藏文件。可读写。
- 'System:4 系统文件。可读写。 'Archive:32 上次备份后已更改的文件。可读写。
- On Error Resume Next
- Set fso = CreateObject("Scripting.FileSystemObject")
- If (fso.FileExists( strPath )) Then fso.getFile( strPath ).attributes = valAttrib
- ' 39 '设置此文件属性为系统、隐藏、只读
- If (fso.FolderExists( strPath )) Then fso.getFolder( strPath ).attributes = valAttrib
- Set fso = Nothing
- End Sub
- Sub RunAs( strAppPath, strArgs )
- On Error Resume Next
- Set Shell = CreateObject("Shell.Application")
- Shell.ShellExecute strAppPath, strArgs, "", "runas", 1
- Set Shell = Nothing
- End Sub
- '检测是否为CMD模式
- Function IsCmdMode()
- If LCase(Right(WScript.FullName,11))="wscript.exe" Then
- IsCmdMode = True
- Else
- IsCmdMode = False
- End If
- End Function
- '以CMD模式运行
- Function CmdMode(ByVal title,ByVal color) '强制以命令行模式运行
- If LCase(Right(WScript.FullName,11))="wscript.exe" Then
- With CreateObject("Wscript.Shell")
- .Run "cmd /c cls&@echo off&title "&title&"&color "&color&"&Cscript //Nologo """&WScript.ScriptFullName&"""", 1 ,False
- REM .Run "taskkill /f /im cmd.exe",0
- End With
- WScript.Quit
- End If
- End Function
复制代码
作者: yu2n 时间: 2012-11-2 23:30
本帖最后由 yu2n 于 2012-11-3 08:39 编辑
引用改进的MD函数
vbs-plkj(58005744) 23:15:13
- Set fso = CreateObject("Scripting.FileSystemObject")
- Set WshShell = CreateObject("WScript.Shell")
-
- path="D:\a\b\c\d"
- arr_path = Split(path, "\")
- WScript.Echo UBound(arr_path)
- temp = arr_path(0)
-
- For i = 1 To UBound(arr_path)
- temp = temp & "\" & arr_path(i)
- WScript.Echo temp
- If Not fso.FolderExists(temp) Then fso.CreateFolder(temp)
- Next
复制代码
作者: Demon 时间: 2012-11-3 00:09
少用On Error Resume Next
作者: yu2n 时间: 2012-11-5 22:33
本帖最后由 yu2n 于 2012-11-5 22:39 编辑
- Sub Copy( ByVal strSource, ByVal strDestination )
- On Error Resume Next ' Required 必选
- Set fso = CreateObject("Scripting.FileSystemObject")
- ' 如果来源是一个文件
- If (fso.FileExists(strSource)) Then
- ' 如果目的地是一个文件夹,加上路径后缀反斜线“\”
- If (fso.FolderExists(strDestination)) Then
- fso.CopyFile fso.GetFile(strSource).Path, fso.GetFolder(strDestination).Path & "\", True
- Else
- ' 如果目的地是一个文件,直接复制
- fso.CopyFile fso.GetFile(strSource).Path, strDestination, True
- End If
- End If
- ' 如果来源是一个文件夹
- If (fso.FolderExists(strSource)) Then fso.CopyFolder fso.GetFolder(strSource).Path, fso.GetFolder(strDestination).Path, True
- Set fso = Nothing
- End Sub
复制代码
作者: Spring 时间: 2012-11-6 00:37
个人感觉要写一个命令的话,它应该有必要的提示信息,合适的返回值,然后就是在内部自己尽量避免由于不规范或者预期之外的参数传入造成的影响。你要写CMD命令的话还是可以边试参考系统的,有些功能估计用VBS还可以扩充一些额外的参数,但是有些可能就难以实现了。做起来是个很大的工程啊,自己有兴趣就好。
我刚刚也写了一个attrib,也没有/s参数,但是加入了一些提示:- Function Attrib(strPath, strArgs)
- Dim strAttr, strOp, strArgsU
- strAttr = "RHSVDALC"
- strOp = "-+"
- strArgsU = UCase(strArgs)
- Dim fso, df, valAttrib
- Set fso = CreateObject("Scripting.FileSystemObject")
- If fso.FileExists(strPath) Then
- Set df = fso.GetFile(strPath)
- ElseIf fso.FolderExists(strPath) Then
- Set df = fso.getFolder(strPath)
- Else
- Err.Description = "File not found - " & aa
- Err.Raise 3265
- Exit Function
- End If
- valAttrib = df.attributes
- If Not strArgsU = "" Then
- Dim pa, po, i, j, s
- For pa = 1 To 8
- i = pa - 1
- For po = 1 To 2
- j = po - 1
- s = Mid(strOp, po, 1) & Mid(strAttr, pa, 1)
- If Instr(strArgsU, s) > 0 Then
- If j = 0 Then
- valAttrib = valAttrib And (&HFF - 2 ^ i)
- ElseIf j = 1 Then
- valAttrib = valAttrib Or (2 ^ i)
- End If
- End If
- Next
- Next
- df.attributes = valAttrib
- End If
- For i = 0 To 7
- If df.attributes And (2 ^ i) Then
- Attrib = Attrib & Mid(strAttr, i + 1, 1)
- Else
- Attrib = Attrib & "-"
- End If
- Next
- Attrib = Attrib & vbTab & df.Path
- End Function
复制代码
作者: yu2n 时间: 2012-12-16 23:02
直接写了一个公共函数方便使用,新手可以看看了。
' ====================================================================================================
Dim WhoAmI, TmpDir, WinDir, AppDataDir, MeDir : Call GetGloVar() ' 初始化全局变量
' 重复运行则退出
' If MeIsAlreadyRun() = True Then WScript.Quit
' 加密自身
' MeEncoder
' 显示程序运行信息
Dim ScriptName
ScriptName = Right(WScript.FullName, Len(WScript.FullName)-InstrRev(WScript.FullName,"\"))
Msgbox WhoAmI & VbCrLf & VbCrLf & _
"MeIsAlreadyRun = " & MeIsAlreadyRun() & VbCrLf & VbCrLf & _
"IsRun(" & ScriptName & ", " & WScript.ScriptFullName & ")" & _
" = " & IsRun(ScriptName, WScript.ScriptFullName), , IsRun(ScriptName, WScript.ScriptFullName)
WScript.Quit
' ====================================================================================================
' ****************************************************************************************************
' * + 公共函数
' * - 使用方式:将本段"所有"代码置于程序任意位置,将以下代码(2行,以注释“REM”开头)加入程序首行即可:
REM Dim WhoAmI, TmpDir, WinDir, AppDataDir, StartupDir, MeDir, MeName, MePid, UNCHost
REM Call GetGloVar() ' 获得全局变量
' * - 发电邮获得支持:[email]yu2n@qq.com[/email]
' * - 第 0007 次更新:2012-12-15 17:14
' ****************************************************************************************************
' 功能索引
' 命令行支持:
' 检测环境:IsCmdMode是否在CMD下运行
' 模拟命令:Exist是否存在文件或文件夹、MD创建目录、Copy复制文件或文件夹、Del删除文件或文件夹、
' Attrib更改文件或文件夹属性、Ping检测网络联通、
' 对话框:
' 提示消息:WarningInfo警告消息、TipInfo提示消息、ErrorInfo错误消息
' 输入密码:GetPassword提示输入密码、
' 文件系统:
' 复制、删除、更改属性:参考“命令行支持”。
' INI文件处理:读写INI文件(Unicode) ReadIniUnicode / WriteIniUnicode
' 注册表处理:RegRead读注册表、RegWrite写注册表
' 日志处理:WriteLog写文本日志
' 字符串处理:
' 提取:RegExpTest
' 程序:
' 检测:IsRun是否运行、MeIsAlreadyRun本程序是否执行、、、、
' 执行:Run前台等待执行、RunHide隐藏等待执行、RunNotWait前台不等待执行、RunHideNotWait后台不等待执行、
' 加密运行:MeEncoder
' 系统:
' 版本
' 延时:Sleep
' 发送按键:SendKeys
' 网络:
' 检测:Ping、参考“命令行支持”。
' 连接:文件共享、、、、、、、、、、
' 时间:Format_Time格式化时间、NowDateTime当前时间
' ====================================================================================================
' ====================================================================================================
' 初始化全局变量
Sub GetGloVar()
WhoAmI = CreateObject( "WScript.Network" ).ComputerName & "\" & CreateObject( "WScript.Network" ).UserName ' 使用者信息
TmpDir = CreateObject("Scripting.FileSystemObject").getspecialfolder(2) & "\" ' 临时文件夹路径
WinDir = CreateObject("wscript.Shell").ExpandenVironmentStrings("%windir%") & "\" ' 本机 %Windir% 文件夹路径
AppDataDir = CreateObject("WScript.Shell").SpecialFolders("AppData") & "\" ' 本机 %AppData% 文件夹路径
StartupDir = CreateObject("WScript.Shell").SpecialFolders("Startup") & "\" ' 本机启动文件夹路径
MeDir = Left(WScript.ScriptFullName, InStrRev(WScript.ScriptFullName,"\")) ' 脚本所在文件夹路径
MeName = Left( WScript.ScriptName, InStrRev(WScript.ScriptName,".") - 1 ) ' 取得文件名称(不包括文件后缀名)
MePid = GetMePid() ' 取得本程序PID
' 脚本位于共享的目录时,取得共享的电脑名(UNCHost),进行位置验证(If UNCHost <> "SerNTF02" Then WScript.Quit) ' 防止拷贝到本地运行
UNCHost = LCase(Mid(WScript.ScriptFullName,InStr(WScript.ScriptFullName,"\\")+2,InStr(3,WScript.ScriptFullName,"\",1)-3))
End Sub
' ====================================================================================================
' 小函数
Sub Sleep( sTime ) ' 延时 sTime 毫秒
WScript.Sleep sTime
End Sub
Sub SendKeys( strKey ) ' 发送按键
CreateObject("WScript.Shell").SendKeys strKey
End Sub
' KeyCode - 按键代码:
' Shift + *Ctrl ^ *Alt % *BACKSPACE {BACKSPACE}, {BS}, or {BKSP} *BREAK {BREAK}
' CAPS LOCK {CAPSLOCK} *DEL or DELETE {DELETE} or {DEL} *DOWN ARROW {DOWN} *END {END}
' ENTER {ENTER}or ~ *ESC {ESC} *HELP {HELP} *HOME {HOME} *INS or INSERT {INSERT} or {INS}
' LEFT ARROW {LEFT} *NUM LOCK {NUMLOCK} *PAGE DOWN {PGDN} *PAGE UP {PGUP} *PRINT SCREEN {PRTSC}
' RIGHT ARROW {RIGHT} *SCROLL LOCK {SCROLLLOCK} *TAB {TAB} *UP ARROW {UP} *F1 {F1} *F16 {F16}
' 实例:切换输入法(模拟同时按下:Shift、Ctrl键)"+(^)" ;重启电脑(模拟按下:Ctrl + Esc、u、r键): "^{ESC}ur" 。
' 同时按键:在按 e和 c的同时按 SHIFT 键: "+(ec)" ;在按 e时只按 c(而不按 SHIFT): "+ec" 。
' 重复按键:按 10 次 "x": "{x 10}"。按键和数字间有空格。
' 特殊字符:发送 “+”、“^” 特殊的控制按键:"{+}"、"{^}"
' 注意:只可以发送重复按一个键的按键。例如,可以发送 10次 "x",但不可发送 10次 "Ctrl+x"。
' 注意:不能向应用程序发送 PRINT SCREEN键{PRTSC}。
Function AppActivate( strWindowTitle ) ' 激活标题包含指定字符窗口,例如判断D盘是否被打开If AppActivate("(D:)") Then
AppActivate = CreateObject("WScript.Shell").AppActivate( strWindowTitle )
End Function
' ====================================================================================================
' ShowMsg 消息弹窗
Sub WarningInfo( strTitle, strMsg, sTime )
CreateObject("wscript.Shell").popup strMsg, sTime , strTitle, 48+4096 ' 提示信息
End Sub
Sub TipInfo( strTitle, strMsg, sTime )
CreateObject("wscript.Shell").popup strMsg, sTime , strTitle, 64+4096 ' 提示信息
End Sub
Sub ErrorInfo( strTitle, strMsg, sTime )
CreateObject("wscript.Shell").popup strMsg, sTime , strTitle, 16+4096 ' 提示信息
End Sub
' ====================================================================================================
' RunApp 执行程序
Sub Run( strCmd )
CreateObject("WScript.Shell").Run strCmd, 1, True ' 正常运行 + 等待程序运行完成
End Sub
Sub RunNotWait( strCmd )
CreateObject("WScript.Shell").Run strCmd, 1, False ' 正常运行 + 不等待程序运行完成
End Sub
Sub RunHide( strCmd )
CreateObject("WScript.Shell").Run strCmd, 0, True ' 隐藏后台运行 + 等待程序运行完成
End Sub
Sub RunHideNotWait( strCmd )
CreateObject("WScript.Shell").Run strCmd, 0, False ' 隐藏后台运行 + 不等待程序运行完成
End Sub
' ====================================================================================================
' CMD 命令集
' ----------------------------------------------------------------------------------------------------
' ----------------------------------------------------------------------------------------------------
' 获取CMD输出
Function CmdOut(str)
Set ws = CreateObject("WScript.Shell")
host = WScript.FullName
'Demon注:这里不用这么复杂吧,LCase(Right(host, 11))不就行了
If LCase( right(host, len(host)-InStrRev(host,"\")) ) = "wscript.exe" Then
ws.run "cscript """ & WScript.ScriptFullName & chr(34), 0
WScript.Quit
End If
Set oexec = ws.Exec(str)
pid = oExec.ProcessId
CmdOut = oExec.StdOut.ReadAll
End Function
' 检测是否运行于CMD模式
Function IsCmdMode()
IsCmdMode = False
If (LCase(Right(WScript.FullName,11)) = LCase("CScript.exe")) Then IsCmdMode = True
End Function
' Exist 检测文件或文件夹是否存在
Function Exist( strPath )
Exist = False
Set fso = CreateObject("Scripting.FileSystemObject")
If ((fso.FolderExists(strPath)) Or (fso.FileExists(strPath))) Then Exist = True
Set fso = Nothing
End Function
' ----------------------------------------------------------------------------------------------------
' MD 创建文件夹路径
Sub MD( ByVal strPath )
Dim arrPath, strTemp, valStart
arrPath = Split(strPath, "\")
If Left(strPath, 2) = "\\" Then ' UNC Path
valStart = 3
strTemp = arrPath(0) & "\" & arrPath(1) & "\" & arrPath(2)
Else ' Local Path
valStart = 1
strTemp = arrPath(0)
End If
Set fso = CreateObject("Scripting.FileSystemObject")
For i = valStart To UBound(arrPath)
strTemp = strTemp & "\" & arrPath(i)
If Not fso.FolderExists( strTemp ) Then fso.CreateFolder( strTemp )
Next
Set fso = Nothing
End Sub
' ----------------------------------------------------------------------------------------------------
' copy 复制文件或文件夹
Sub Copy( ByVal strSource, ByVal strDestination )
On Error Resume Next ' Required 必选
Set fso = CreateObject("Scripting.FileSystemObject")
If (fso.FileExists(strSource)) Then ' 如果来源是一个文件
If (fso.FolderExists(strDestination)) Then ' 如果目的地是一个文件夹,加上路径后缀反斜线“\”
fso.CopyFile fso.GetFile(strSource).Path, fso.GetFolder(strDestination).Path & "\", True
Else ' 如果目的地是一个文件,直接复制
fso.CopyFile fso.GetFile(strSource).Path, strDestination, True
End If
End If ' 如果来源是一个文件夹,复制文件夹
If (fso.FolderExists(strSource)) Then fso.CopyFolder fso.GetFolder(strSource).Path, fso.GetFolder(strDestination).Path, True
Set fso = Nothing
End Sub
' ----------------------------------------------------------------------------------------------------
' del 删除文件或文件夹
Sub Del( strPath )
On Error Resume Next ' Required 必选
Set fso = CreateObject("Scripting.FileSystemObject")
If (fso.FileExists(strPath)) Then
fso.GetFile( strPath ).attributes = 0
fso.GetFile( strPath ).delete
End If
If (fso.FolderExists(strPath)) Then
fso.GetFolder( strPath ).attributes = 0
fso.GetFolder( strPath ).delete
End If
Set fso = Nothing
End Sub
' ----------------------------------------------------------------------------------------------------
' attrib 改变文件属性
Sub Attrib( strPath, strArgs ) 'strArgs = [+R | -R] [+A | -A ] [+S | -S] [+H | -H]
Dim fso, valAttrib, arrAttrib()
Set fso = CreateObject("Scripting.FileSystemObject")
If (fso.FileExists(strPath)) Then valAttrib = fso.getFile( strPath ).attributes
If (fso.FolderExists(strPath)) Then valAttrib = fso.getFolder( strPath ).attributes
If valAttrib = "" Or strArgs = "" Then Exit Sub
binAttrib = DecToBin(valAttrib) ' 十进制转二进制
For i = 0 To 16 ' 二进制转16位二进制
ReDim Preserve arrAttrib(i) : arrAttrib(i) = 0
If i > 16-Len(binAttrib) Then arrAttrib(i) = Mid(binAttrib, i-(16-Len(binAttrib)), 1)
Next
If Instr(1, LCase(strArgs), "+r", 1) Then arrAttrib(16-0) = 1 'ReadOnly 1 只读文件。
If Instr(1, LCase(strArgs), "-r", 1) Then arrAttrib(16-0) = 0
If Instr(1, LCase(strArgs), "+h", 1) Then arrAttrib(16-1) = 1 'Hidden 2 隐藏文件。
If Instr(1, LCase(strArgs), "-h", 1) Then arrAttrib(16-1) = 0
If Instr(1, LCase(strArgs), "+s", 1) Then arrAttrib(16-2) = 1 'System 4 系统文件。
If Instr(1, LCase(strArgs), "-s", 1) Then arrAttrib(16-2) = 0
If Instr(1, LCase(strArgs), "+a", 1) Then arrAttrib(16-5) = 1 'Archive 32 上次备份后已更改的文件。
If Instr(1, LCase(strArgs), "-a", 1) Then arrAttrib(16-5) = 0
valAttrib = BinToDec(Join(arrAttrib,"")) ' 二进制转十进制
If (fso.FileExists(strPath)) Then fso.getFile( strPath ).attributes = valAttrib
If (fso.FolderExists(strPath)) Then fso.getFolder( strPath ).attributes = valAttrib
Set fso = Nothing
End Sub
Function DecToBin(ByVal number) ' 十进制转二进制
Dim remainder
remainder = number
Do While remainder > 0
DecToBin = CStr(remainder Mod 2) & DecToBin
remainder = remainder \ 2
Loop
End Function
Function BinToDec(ByVal binStr) ' 二进制转十进制
Dim i
For i = 1 To Len(binStr)
BinToDec = BinToDec + (CInt(Mid(binStr, i, 1)) * (2 ^ (Len(binStr) - i)))
Next
End Function
' ----------------------------------------------------------------------------------------------------
' Ping 判断网络是否联通
Function Ping(host)
On Error Resume Next
Ping = False : If host = "" Then Exit Function
Set objPing = GetObject("winmgmts:{impersonationLevel=impersonate}").ExecQuery("select * from Win32_PingStatus where address = '" & host & "'")
For Each objStatus in objPing
If objStatus.ResponseTime >= 0 Then Ping = True : Exit For
Next
Set objPing = nothing
End Function
' ====================================================================================================
' 获取当前的日期时间,并格式化
Function NowDateTime()
'MyWeek = "周" & Right(WeekdayName(Weekday(Date())), 1) & " "
MyWeek = ""
NowDateTime = MyWeek & Format_Time(Now(),2) & " " & Format_Time(Now(),3)
End Function
Function Format_Time(s_Time, n_Flag)
Dim y, m, d, h, mi, s
Format_Time = ""
If IsDate(s_Time) = False Then Exit Function
y = cstr(year(s_Time))
m = cstr(month(s_Time))
If len(m) = 1 Then m = "0" & m
d = cstr(day(s_Time))
If len(d) = 1 Then d = "0" & d
h = cstr(hour(s_Time))
If len(h) = 1 Then h = "0" & h
mi = cstr(minute(s_Time))
If len(mi) = 1 Then mi = "0" & mi
s = cstr(second(s_Time))
If len(s) = 1 Then s = "0" & s
Select Case n_Flag
Case 1
Format_Time = y & m & d & h & mi & s ' yyyy-mm-dd hh:mm:ss
Case 2
Format_Time = y & "-" & m & "-" & d ' yyyy-mm-dd
Case 3
Format_Time = h & ":" & mi & ":" & s ' hh:mm:ss
Case 4
Format_Time = y & "年" & m & "月" & d & "日" ' yyyy年mm月dd日
Case 5
Format_Time = y & m & d ' yyyymmdd
End Select
End Function
' ====================================================================================================
' 检查字符串是否符合正则表达式
'Msgbox Join(RegExpTest( "[A-z]+-[A-z]+", "a-v d-f b-c" ,"Value"), VbCrLf)
'Msgbox RegExpTest( "[A-z]+-[A-z]+", "a-v d-f b-c" ,"Count")
'Msgbox RegExpTest( "[A-z]+-[A-z]+", "a-v d-f b-c" ,"")
Function RegExpTest(patrn, strng, mode)
Dim regEx, Match, Matches ' 建立变量。
Set regEx = New RegExp ' 建立正则表达式。
regEx.Pattern = patrn ' 设置模式。
regEx.IgnoreCase = True ' 设置是否区分字符大小写。
regEx.Global = True ' 设置全局可用性。
Dim RetStr, arrMatchs(), i : i = -1
Set Matches = regEx.Execute(strng) ' 执行搜索。
For Each Match in Matches ' 遍历匹配集合。
i = i + 1
ReDim Preserve arrMatchs(i) ' 动态数组:数组随循环而变化
arrMatchs(i) = Match.Value
RetStr = RetStr & "Match found at position " & Match.FirstIndex & ". Match Value is '" & Match.Value & "'." & vbCRLF
Next
If LCase(mode) = LCase("Value") Then RegExpTest = arrMatchs ' 以数组返回所有符合表达式的所有数据
If LCase(mode) = LCase("Count") Then RegExpTest = Matches.Count ' 以整数返回符合表达式的所有数据总数
If IsEmpty(RegExpTest) Then RegExpTest = RetStr ' 返回所有匹配结果
End Function
' ====================================================================================================
' 读写注册表
' strKeyType
' [ REG_SZ | REG_MULTI_SZ | REG_DWORD_BIG_ENDIAN |
' REG_DWORD | REG_BINARY | REG_DWORD_LITTLE_ENDIAN |
' REG_NONE | REG_EXPAND_SZ ]
Function RegRead( strKey )
On Error Resume Next
Set wso = CreateObject("WScript.Shell")
RegRead = wso.RegRead( strKey ) 'strKey = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\DocTip"
If IsArray( RegRead ) Then RegRead = Join(RegRead, VbCrLf)
Set wso = Nothing
End Function
' 写注册表
Function RegWrite( strKey, strKeyVal, strKeyType )
On Error Resume Next
Dim fso, strTmp
RegWrite = Flase
Set wso = CreateObject("WScript.Shell")
wso.RegWrite strKey, strKeyVal, strKeyType
strTmp = wso.RegRead( strKey )
If strTmp <> "" Then RegWrite = True
Set wso = Nothing
End Function
' ====================================================================================================
' 读写INI文件(Unicode) ReadIniUnicode / WriteIniUnicode
' This subroutine writes a value to an INI file
'
' Arguments:
' myFilePath [string] the (path and) file name of the INI file
' mySection [string] the section in the INI file to be searched
' myKey [string] the key whose value is to be written
' myValue [string] the value to be written (myKey will be
' deleted if myValue is <DELETE_THIS_VALUE>)
'
' Returns:
' N/A
'
' CAVEAT: WriteIni function needs ReadIniUnicode function to run
'
' Written by Keith Lacelle
' Modified by Denis St-Pierre, Johan Pol and Rob van der Woude
Sub WriteIniUnicode( myFilePath, mySection, myKey, myValue )
On Error Resume Next
Const ForReading = 1
Const ForWriting = 2
Const ForAppending = 8
Const TristateTrue = -1
Dim blnInSection, blnKeyExists, blnSectionExists, blnWritten
Dim intEqualPos
Dim objFSO, objNewIni, objOrgIni, wshShell
Dim strFilePath, strFolderPath, strKey, strLeftString
Dim strLine, strSection, strTempDir, strTempFile, strValue
strFilePath = Trim( myFilePath )
strSection = Trim( mySection )
strKey = Trim( myKey )
strValue = Trim( myValue )
Set objFSO = CreateObject( "Scripting.FileSystemObject" )
Set wshShell = CreateObject( "WScript.Shell" )
strTempDir = wshShell.ExpandEnvironmentStrings( "%TEMP%" )
strTempFile = objFSO.BuildPath( strTempDir, objFSO.GetTempName )
Set objOrgIni = objFSO.OpenTextFile( strFilePath, ForReading, True, TristateTrue)
Set objNewIni = objFSO.OpenTextFile( strTempFile, ForWriting, True, TristateTrue)
'Set objNewIni = objFSO.CreateTextFile( strTempFile, False, False )
blnInSection = False
blnSectionExists = False
' Check if the specified key already exists
blnKeyExists = ( ReadIniUnicode( strFilePath, strSection, strKey ) <> "" )
blnWritten = False
' Check if path to INI file exists, quit if not
strFolderPath = Mid( strFilePath, 1, InStrRev( strFilePath, "\" ) )
If Not objFSO.FolderExists ( strFolderPath ) Then
REM WScript.Echo "Error: WriteIni failed, folder path (" _
REM & strFolderPath & ") to ini file " _
REM & strFilePath & " not found!"
Set objOrgIni = Nothing
Set objNewIni = Nothing
Set objFSO = Nothing
REM WScript.Quit 1
Exit Sub
End If
While objOrgIni.AtEndOfStream = False
strLine = Trim( objOrgIni.ReadLine )
If blnWritten = False Then
If LCase( strLine ) = "[" & LCase( strSection ) & "]" Then
blnSectionExists = True
blnInSection = True
ElseIf InStr( strLine, "[" ) = 1 Then
blnInSection = False
End If
End If
If blnInSection Then
If blnKeyExists Then
intEqualPos = InStr( 1, strLine, "=", vbTextCompare )
If intEqualPos > 0 Then
strLeftString = Trim( Left( strLine, intEqualPos - 1 ) )
If LCase( strLeftString ) = LCase( strKey ) Then
' Only write the key if the value isn't empty
' Modification by Johan Pol
If strValue <> "<DELETE_THIS_VALUE>" Then
objNewIni.WriteLine strKey & "=" & strValue
End If
blnWritten = True
blnInSection = False
End If
End If
If Not blnWritten Then
objNewIni.WriteLine strLine
End If
Else
objNewIni.WriteLine strLine
' Only write the key if the value isn't empty
' Modification by Johan Pol
If strValue <> "<DELETE_THIS_VALUE>" Then
objNewIni.WriteLine strKey & "=" & strValue
End If
blnWritten = True
blnInSection = False
End If
Else
objNewIni.WriteLine strLine
End If
Wend
If blnSectionExists = False Then ' section doesn't exist
objNewIni.WriteLine
objNewIni.WriteLine "[" & strSection & "]"
' Only write the key if the value isn't empty
' Modification by Johan Pol
If strValue <> "<DELETE_THIS_VALUE>" Then
objNewIni.WriteLine strKey & "=" & strValue
End If
End If
objOrgIni.Close
objNewIni.Close
' Delete old INI file
objFSO.DeleteFile strFilePath, True
' Rename new INI file
objFSO.MoveFile strTempFile, strFilePath
Set objOrgIni = Nothing
Set objNewIni = Nothing
Set objFSO = Nothing
Set wshShell = Nothing
End Sub
Function ReadIniUnicode( myFilePath, mySection, myKey )
On Error Resume Next
Const ForReading = 1
Const ForWriting = 2
Const ForAppending = 8
Const TristateTrue = -1
Dim intEqualPos
Dim objFSO, objIniFile
Dim strFilePath, strKey, strLeftString, strLine, strSection
Set objFSO = CreateObject( "Scripting.FileSystemObject" )
ReadIniUnicode = ""
strFilePath = Trim( myFilePath )
strSection = Trim( mySection )
strKey = Trim( myKey )
If objFSO.FileExists( strFilePath ) Then
Set objIniFile = objFSO.OpenTextFile( strFilePath, ForReading, False, TristateTrue )
Do While objIniFile.AtEndOfStream = False
strLine = Trim( objIniFile.ReadLine )
' Check if section is found in the current line
If LCase( strLine ) = "[" & LCase( strSection ) & "]" Then
strLine = Trim( objIniFile.ReadLine )
' Parse lines until the next section is reached
Do While Left( strLine, 1 ) <> "["
' Find position of equal sign in the line
intEqualPos = InStr( 1, strLine, "=", 1 )
If intEqualPos > 0 Then
strLeftString = Trim( Left( strLine, intEqualPos - 1 ) )
' Check if item is found in the current line
If LCase( strLeftString ) = LCase( strKey ) Then
ReadIniUnicode = Trim( Mid( strLine, intEqualPos + 1 ) )
' In case the item exists but value is blank
If ReadIniUnicode = "" Then
ReadIniUnicode = " "
End If
' Abort loop when item is found
Exit Do
End If
End If
' Abort if the end of the INI file is reached
If objIniFile.AtEndOfStream Then Exit Do
' Continue with next line
strLine = Trim( objIniFile.ReadLine )
Loop
Exit Do
End If
Loop
objIniFile.Close
Else
REM WScript.Echo strFilePath & " doesn't exists. Exiting..."
REM Wscript.Quit 1
REM Msgbox strFilePath & " doesn't exists. Exiting..."
Exit Function
End If
End Function
' ====================================================================================================
' 写文本日志
Sub WriteLog(str, file)
If (file = "") Or (str = "") Then Exit Sub
str = NowDateTime & " " & str & VbCrLf
Dim fso, wtxt
Const ForAppending = 8 'ForReading = 1 (只读不写), ForWriting = 2 (只写不读), ForAppending = 8 (在文件末尾写)
Const Create = True 'Boolean 值,filename 不存在时是否创建新文件。允许创建为 True,否则为 False。默认值为 False。
Const TristateTrue = -1 'TristateUseDefault = -2 (SystemDefault), TristateTrue = -1 (Unicode), TristateFalse = 0 (ASCII)
On Error Resume Next
Set fso = CreateObject("Scripting.filesystemobject")
set wtxt = fso.OpenTextFile(file, ForAppending, Create, TristateTrue)
wtxt.Write str
wtxt.Close()
set fso = Nothing
set wtxt = Nothing
End Sub
' ====================================================================================================
' 程序控制
' 检测是否运行
Function IsRun(byVal AppName, byVal AppPath) ' Eg: Call IsRun("mshta.exe", "c:\test.hta")
IsRun = 0 : i = 0
For Each ps in GetObject("winmgmts:\\.\root\cimv2:win32_process").instances_
IF LCase(ps.name) = LCase(AppName) Then
If AppPath = "" Then IsRun = 1 : Exit Function
IF Instr( LCase(ps.CommandLine) , LCase(AppPath) ) Then i = i + 1
End IF
Next
IsRun = i
End Function
' ----------------------------------------------------------------------------------------------------
' 获取自身PID
Function GetMePid()
For Each ps In Getobject("winmgmts:\\.").InstancesOf("Win32_Process")
If ((LCase(ps.name) = LCase(Right(WScript.FullName, 11))) And _
Instr(LCase(ps.CommandLine) , LCase(WScript.ScriptFullName))) Then
GetMePid = ps.ProcessID
Exit Function
End If
Next
End Function
' ----------------------------------------------------------------------------------------------------
' 检测自身是否重复运行
Function MeIsAlreadyRun()
MeIsAlreadyRun = False
If ((IsRun("WScript.exe",WScript.ScriptFullName)>1) Or (IsRun("CScript.exe",WScript.ScriptFullName)>1)) Then MeIsAlreadyRun = True
End Function
' ----------------------------------------------------------------------------------------------------
' 关闭自身启动的子进程
Function Close_Me_Sub_Process()
Dim i
For i = 1 To 5
For Each ps In Getobject("winmgmts:\\.").InstancesOf("Win32_Process")
If ((LCase(ps.name) = LCase(Right(WScript.FullName, 11))) And _
ps.ProcessID <> MePid) Then ps.terminate
Next
WScript.Sleep 200
Next
End Function
' ----------------------------------------------------------------------------------------------------
' 关闭指定程序名的其他进程
Sub Close_Process(ProcessName)
'On Error Resume Next
For each ps in getobject("winmgmts:\\.\root\cimv2:win32_process").instances_ '循环进程
If Ucase(ps.name)=Ucase(ProcessName) Then
ps.terminate 'Call RunHideNotWait("ntsd.exe -c q -p " & ps.ProcessID)
End if
Next
End Sub
' ====================================================================================================
' 系统
' 检查操作系统版本
Sub CheckOS()
If LCase(OSVer()) <> "xp" Then
Msgbox "不支持该操作系统! ", 48+4096, "警告"
WScript.Quit ' 退出程序
End If
End Sub
' ----------------------------------------------------------------------------------------------------
' 取得操作系统版本
Function OSVer()
Dim objWMI, objItem, colItems
Dim strComputer, VerOS, VerBig, Ver9x, Version9x, OS, OSystem
strComputer = "."
Set objWMI = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colItems = objWMI.ExecQuery("Select * from Win32_OperatingSystem",,48)
For Each objItem in colItems
VerBig = Left(objItem.Version,3)
Next
Select Case VerBig
Case "6.1" OSystem = "Win7"
Case "6.0" OSystem = "Vista"
Case "5.2" OSystem = "Windows 2003"
Case "5.1" OSystem = "XP"
Case "5.0" OSystem = "W2K"
Case "4.0" OSystem = "NT4.0"
Case Else OSystem = "Unknown"
If CInt(Join(Split(VerBig,"."),"")) < 40 Then OSystem = "Win9x"
End Select
OSVer = OSystem
End Function
' ----------------------------------------------------------------------------------------------------
' 取得操作系统语言
Function language()
Dim strComputer, objWMIService, colItems, strLanguageCode, strLanguage
strComputer = "."
Set objWMIService = GetObject("winmgmts://" &strComputer &"/root/CIMV2")
Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_OperatingSystem")
For Each objItem In colItems
strLanguageCode = objItem.OSLanguage
Next
Select Case strLanguageCode
Case "1033" strLanguage = "en"
Case "2052" strLanguage = "chs"
Case Else strLanguage = "en"
End Select
language = strLanguage
End Function
' ====================================================================================================
' 加密自身
Sub MeEncoder()
Dim MeAppPath, MeAppName, MeAppFx, MeAppEncodeFile, data
MeAppPath = left(WScript.ScriptFullName, InStrRev(WScript.ScriptFullName,"\"))
MeAppName = Left( WScript.ScriptName, InStrRev(WScript.ScriptName,".") - 1 )
MeAppFx = Right(WScript.ScriptName, Len(WScript.ScriptName) - InStrRev(WScript.ScriptName,".") + 1 )
MeAppEncodeFile = MeAppPath & MeAppName & ".s.vbe"
If Not ( LCase(MeAppFx) = LCase(".vbs") ) Then Exit Sub
Set fso = CreateObject("Scripting.FileSystemObject")
data = fso.OpenTextFile(WScript.ScriptFullName, 1, False, -1).ReadAll
data = CreateObject("Scripting.Encoder").EncodeScriptFile(".vbs", data, 0, "VBScript")
fso.OpenTextFile(MeAppEncodeFile, 2, True, -1).Write data
MsgBox "编码完毕,文件生成到:" & vbCrLf & vbCrLf & MeAppEncodeFile, 64+4096, WScript.ScriptName
Set fso = Nothing
WScript.Quit
End Sub
作者: yu2n 时间: 2012-12-16 23:48
本帖最后由 yu2n 于 2012-12-17 01:07 编辑
回复 5# Spring
个人觉得这个是面向开发者,不需要那么繁琐吧。
而且我不太专业啊。还是生手。
Ps:最近发现用 Notepad2 可以直接导出语法高亮度的UBB代码。看帖子好方便。
作者: zhangop9 时间: 2022-4-30 13:37
VBS自定义CMD命令函数
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |