Назад | Перейти на главную страницу

vbs для обнаружения USB-накопителя и выполнения некоторых команд

У меня есть два скрипта. Оба находятся в одной папке на жестком диске. «Vbs» вызывает «летучую мышь» для обнаружения USB для выполнения некоторых команд.

Хочу включить функцию выбора usb в 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

ВАЖНОЕ ПРИМЕЧАНИЕ: нет правильного ответа.

  1. VBScript: пожалуйста, прочтите Роб Хаупта пять лучших практик VBScript и Роб ван дер Вуд Отладка ваших скриптов; коротко:

  2. Пакетный сценарий: прочтите, пожалуйста, Роб ван дер Вуд Отладка ваших командных файлов.

  3. Почему бы не остаться в пакетном скрипте для всех поставленных задач? Применим wmic команда: the Win32_Volume класс (представляет собой область хранения на жестком диске) или Win32_LogicalDisk WMI-класс (представляет источник данных, который преобразуется в реальное локальное запоминающее устройство в компьютерной системе под управлением 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>).

См Дэйва Бенхэма 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

==>

Дополнительные ресурсы (обязательное чтение для пакетного скриптера):

*** редактировать: к сожалению, запрос DriveType собственность в обоих Win32_Volume и Win32_LogicalDisk классы wmi могут давать ложные результаты, см. следующий вывод, где оба 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 заменяются, поскольку я ненавижу все диалоговые окна, всплывающие окна и т. д., если их вывод бесполезен в данном контексте:

' 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.bat:

@ECHO OFF
SETLOCAL EnableExtensions
echo 0th parameter = %0
echo     script = %~f0
echo parameters = %*
pause
ENDLOCAL
exit /B

редактировать К сожалению, DriveType Собственность Drive объект в FileSystemObject может дать те же ложные результаты, что и запрос DriveType собственность в обоих Win32_Volume и Win32_LogicalDisk wmi классы. 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

==>