У меня есть два скрипта. Оба находятся в одной папке на жестком диске. «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
ВАЖНОЕ ПРИМЕЧАНИЕ: нет правильного ответа.
VBScript: пожалуйста, прочтите Роб Хаупта пять лучших практик VBScript и Роб ван дер Вуд Отладка ваших скриптов; коротко:
Option Explicit
заявление всегда (если используется, Option Explicit
оператор должен появляться в сценарии перед любыми другими операторами) и On Error GoTo 0
заявление хотя бы для отладки; прочитать пример в это мой ответ об обработке ошибок VBScript.Пакетный сценарий: прочтите, пожалуйста, Роб ван дер Вуд Отладка ваших командных файлов.
Почему бы не остаться в пакетном скрипте для всех поставленных задач? Применим 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
==>
Дополнительные ресурсы (обязательное чтение для пакетного скриптера):
%~G
и т.д. специальная страница) Аргументы командной строки (параметры)>>
, 2>NUL
и т.д. специальная страница) Перенаправление*** редактировать: к сожалению, запрос 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
==>