我有两个脚本。 两者都位于硬盘上的同一文件夹内。 “vbs”调用“bat”来检测usb是否运行一些命令。
我想把selectUSB的functionjoin到VBS中。 谢谢
usb.vbs
Option Explicit On Error Resume next mensaje = MSGBOX ("Start USB fix", vbOKCancel, "USB fix") If mensaje = vbOK Then SCRIPT = "usb.bat" Set objShell = CreateObject("Wscript.Shell") strPath = Wscript.ScriptFullName Set objFSO = CreateObject("Scripting.FileSystemObject") Set objFile = objFSO.GetFile(strPath) strFolder = objFSO.GetParentFolderName(objFile) NewPath = objFSO.BuildPath(strFolder, SCRIPT) set objshell = createobject("wscript.shell") objshell.run NewPath, 1, true Else End If On Error GoTo 0
usb.bat
@echo off set /p drive=Choose the drive usb letter: if exist %drive%: (goto target) :target attrib /d /s -r -h -s %drive%:\*.* :: ext call:ext "*.ini*" call:ext "*.lnk*" exit :: funcion ext @echo off pause goto:eof :ext set ext=%1 del /f/q/s %drive%:\"%ext%" goto:eof
重要提示:没有答案是正确的。
VBScript:请阅读Rob Haupt的五个VBScript“最佳实践”和Rob van der Woude的“ debugging脚本” 简而言之:
Option Explicit语句 (如果使用的话, Option Explicit语句必须在任何其他语句之前出现在脚本中)和 On Error GoTo 0语句进行debugging; 阅读这个关于VBScripterror handling的答案的例子。 批处理脚本:请阅读Rob van der Woude的“ debuggingbatch file” 。
为什么不留在所有给定任务的批处理脚本? 让我们应用wmic命令 : Win32_Volume类 (表示硬盘上的存储区域)或Win32_LogicalDisk WMI类 (表示parsing为运行Windows的计算机系统上的实际本地存储设备的数据源)。
试试自己***看看下面的编辑 :
wmic path Win32_Volume get BlockSize, DriveLetter, DriveType, Label wmic path Win32_LogicalDisk get DeviceID, DriveType, Description, VolumeName, FileSystem rem or full output: wmic path Win32_Volume get /value wmic path Win32_LogicalDisk get /value
以下是批处理脚本的可能框架(自己将其与usb.bat脚本放在一起):
@ECHO OFF SETLOCAL EnableExtensions DisableDelayedExpansion set "_drives=" for /F "tokens=*" %%G in (' wmic path Win32_LogicalDisk where "DriveType=2" get DeviceID /value ^|findstr "=" ') do for %%g in ("%%~G") do ( set "__%%~g" echo( rem echo going to process drive __%%~g call :processDrive ) ENDLOCAL goto :eof :processDrive echo processing drive %__DeviceID% pushd "%__DeviceID%\" 2>NUL dir /S /B /A *.ini 2>NUL dir /S /B /A *.lnk popd goto :eof
这里的for循环是
%%G来检索DeviceID值; %%g删除返回值中的结尾回车符 : wmic行为:每个输出行以0x0D0D0A ( <CR><CR><LF> )而不是常见的0x0D0A ( <CR><LF> ) 0x0D0A 。 请参阅Dave Benham的WMIC和FOR /F :针对结尾<CR>问题的修复
输出 :
==> D:\bat\SF\786392.bat processing drive F: F:\Shortcut.lnk F:\vbScriptDoc\Hey_Scripting_Guy.lnk processing drive G: G:\SPSS\admin\SCRIPTS.INI G:\SPSS\admin\system32\GroupPolicy\GPT.INI G:\VB_scripts\Net\nethood_create_a_link.vbs.lnk ==>
更多的资源 (批量阅读所需):
%~G等特殊页面) 命令行参数(参数) >> , 2>NUL等特殊页面) redirect *** 编辑 :不幸的是,在Win32_Volume和Win32_LogicalDisk wmi类中查询DriveType属性可能会给出错误结果,请参阅下一个输出,其中F:和G:都是USB可移动媒体,以便DriveType属性应为2 :
==> wmic path Win32_LogicalDisk get DeviceID,DriveType,Description,VolumeName, FileSystem,Size Description DeviceID DriveType FileSystem Size VolumeName Local Fixed Disk C: 3 NTFS 119664537600 Local Fixed Disk D: 3 NTFS 1000202039296 DataDisk CD-ROM Disc E: 5 Removable Disk F: 2 FAT 519274496 KINGSTON Local Fixed Disk G: 3 FAT32 500044136448 GOG ==> wmic path Win32_Volume get BlockSize, DriveLetter, DriveType, Label, Capacity BlockSize Capacity DriveLetter DriveType Label 4096 1000202039296 D: 3 DataDisk 4096 366997504 3 Rezervováno systémem 8192 519274496 F: 2 KINGSTON 65536 500044136448 G: 3 GOG 4096 119664537600 C: 3 E: 5
您需要合并下一个WMI / WMIC查询以获取可移动磁盘的正确驱动器号:
==> wmic path Win32_DiskDrive get DeviceID, InterfaceType, MediaType DeviceID InterfaceType MediaType \\.\PHYSICALDRIVE1 IDE Fixed hard disk media \\.\PHYSICALDRIVE2 USB Removable Media \\.\PHYSICALDRIVE0 IDE Fixed hard disk media \\.\PHYSICALDRIVE3 USB External hard disk media ==> wmic path Win32_DiskDriveToDiskPartition get /value Antecedent="\\USER-PC\root\cimv2:Win32_DiskDrive.DeviceID="\\.\PHYSICALDRIVE1"" Dependent="\\USER-PC\root\cimv2:Win32_DiskPartition.DeviceID="Disk #1, Partition #0"" Antecedent="\\USER-PC\root\cimv2:Win32_DiskDrive.DeviceID="\\.\PHYSICALDRIVE1"" Dependent="\\USER-PC\root\cimv2:Win32_DiskPartition.DeviceID="Disk #1, Partition #1"" Antecedent="\\USER-PC\root\cimv2:Win32_DiskDrive.DeviceID="\\.\PHYSICALDRIVE2"" Dependent="\\USER-PC\root\cimv2:Win32_DiskPartition.DeviceID="Disk #2, Partition #0"" Antecedent="\\USER-PC\root\cimv2:Win32_DiskDrive.DeviceID="\\.\PHYSICALDRIVE0"" Dependent="\\USER-PC\root\cimv2:Win32_DiskPartition.DeviceID="Disk #0, Partition #0"" Antecedent="\\USER-PC\root\cimv2:Win32_DiskDrive.DeviceID="\\.\PHYSICALDRIVE3"" Dependent="\\USER-PC\root\cimv2:Win32_DiskPartition.DeviceID="Disk #3, Partition #0"" ==> wmic path Win32_LogicalDiskToPartition get /value Antecedent="\\USER-PC\root\cimv2:Win32_DiskPartition.DeviceID="Disk #1, Partition #1"" Dependent="\\USER-PC\root\cimv2:Win32_LogicalDisk.DeviceID="C:"" EndingAddress=120032591871 StartingAddress=368050176 Antecedent="\\USER-PC\root\cimv2:Win32_DiskPartition.DeviceID="Disk #0, Partition #0"" Dependent="\\USER-PC\root\cimv2:Win32_LogicalDisk.DeviceID="D:"" EndingAddress=1000203091967 StartingAddress=1048576 Antecedent="\\USER-PC\root\cimv2:Win32_DiskPartition.DeviceID="Disk #2, Partition #0"" Dependent="\\USER-PC\root\cimv2:Win32_LogicalDisk.DeviceID="F:"" EndingAddress=519569407 StartingAddress=16384 Antecedent="\\USER-PC\root\cimv2:Win32_DiskPartition.DeviceID="Disk #3, Partition #0"" Dependent="\\USER-PC\root\cimv2:Win32_LogicalDisk.DeviceID="G:"" EndingAddress=500105249279 StartingAddress=32256
这是我对你的usb.vbs改变。 请注意,大多数MSGBOX被取代,因为我讨厌所有的对话框,popup框等,如果他们的输出在给定的上下文无用:
' VB Script Document option explicit 'On Error Resume Next On Error GoTo 0 Dim strResult: strResult = Wscript.ScriptName Dim objFSO, objShell, objDrive, scriptBaseName Dim mensaje, SCRIPT Dim strPath, objFile, strFolder, NewPath, strDrive, strcmd, iResult mensaje = MSGBOX ("Start USB fix", vbOKCancel, "USB fix") If mensaje = vbOK Then Set objFSO = CreateObject("Scripting.FileSystemObject") Set objShell = CreateObject("Wscript.Shell") scriptBaseName = objFSO.GetBaseName(Wscript.ScriptFullName) SCRIPT = "usb.bat" strPath = Wscript.ScriptFullName Set objFile = objFSO.GetFile(strPath) strFolder = objFSO.GetParentFolderName(objFile) NewPath = objFSO.BuildPath(strFolder, SCRIPT) For Each objDrive In objFSO.Drives strResult = strResult & vbNewLine & objDrive.DriveLetter & vbTab & objDrive.DriveType If objDrive.DriveType = 1 And objDrive.IsReady Then '' strDrive = objDrive.DriveLetter & ":\" '''xmsgbox objDrive.DriveLetter & ":\ = " & objDrive.VolumeName, vbInformation, scriptBaseName 'strcmd = "cmd.exe /C """ & NewPath & """ " & strDrive ' executable strcmd = """" & NewPath & """ " & strDrive ' batch script iResult = objshell.run( strcmd , 1, true) strResult = strResult & vbTab & strcmd & vbTab & iResult '''CALL xMSGBOX ("Finish USB fix", VBOKONLY, "USB fix") End If Next Else CALL xMSGBOX ("Cancel USB fix", VBOKONLY, "USB fix") End If 'strResult = strResult & vbNewLine & Wscript.Echo strResult Wscript.Quit Sub xMSGBOX(byVal sPrompt, byVal sButtons, byVal sTitle) strResult = strResult & vbNewLine & "=" & sPrompt & " =" & sButtons & " =" & sTitle End Sub
使用下一个usb.battesting:
@ECHO OFF SETLOCAL EnableExtensions echo 0th parameter = %0 echo script = %~f0 echo parameters = %* pause ENDLOCAL exit /B
编辑不幸的是, FileSystemObject中的Drive对象的DriveType属性可能会给出与在Win32_Volume和Win32_LogicalDisk wmi类中查询DriveType属性相同的错误结果。 Cf从上面的786392.vbs脚本输出(运行在与当前问题的其他答案中的示例相同的数据)。 事实上,这里的驱动器G是一个USB可移动磁盘,所以应该是DriveType 1 。
==> cscript D:\VB_scripts\SF\786392.vbs 786392.vbs C 2 drive type=2 D 2 drive type=2 E 4 drive type=4 F 1 "D:\VB_scripts\SF\usb.bat" F:\ 0 G 2 drive type=2
==>