1

Тема: VBScript: Копирование файла с неизвестной буквой диска

Добрый день. Помогите понять, что я делаю не так?

On Error Resume Next
Set FSO = CreateObject("Scripting.FileSystemObject")
colDrives = Split("D E F G H I J K L M N O P Q R S T U V W X Y Z")
Set dictDrives = CreateObject("Scripting.Dictionary")
For Each Drive In colDrives
    Set Drv = FSO.GetDrive(Drive & ":")
    If Err.Number Then
        dictDrives.Add Drive & ":", False
    Else
        If Drv.DriveType = 1 And Drv.IsReady Then
            dictDrives.Add Drive & ":", True
        Else
            dictDrives.Add Drive & ":", False
        End If
    End If
    Err.Clear
Next
' Бесконечный цикл
While True
    For Each Drive In dictDrives.Keys
        Set Drv = FSO.GetDrive(Drive)
        If (Err.Number) Or (Drv.IsReady = False) Or (Drv.DriveType <> 1) Then
            Flag = False
        Else
            Flag = True
        End If
        Err.Clear
        Current = dictDrives.Item(Drive)
        If Current <> Flag Then
            If Current = False And Flag = True Then


Const OverwriteExisting = True

Set kopirovaniefaila = CreateObject("Scripting.FileSystemObject")
kopirovaniefaila.CopyFile "C:\FSO\ScriptLog.txt" , Drive + ":\Archive\", OverwriteExisting

WScript.Echo "Диск " & Drive & " был подключён."

            Else
                '
            End If
            dictDrives.Item(Drive) = Flag
        End If
    Next
    WScript.Sleep 1000
Wend

Вроде определяет, но никак не хочет копировать txt файл в папку Archive. Как я только не изголялся, не знаю я как правильно написать.

2

Re: VBScript: Копирование файла с неизвестной буквой диска

SNR93, начните с того, что опишите словами а) Ваш алгоритм, б) что нужно получить.

3

Re: VBScript: Копирование файла с неизвестной буквой диска

Пользователь заходит под определенной учеткой. В момент входа и выхода в учетную запись запускается программа, которая записывает в txt файл дату, время проведенное в системе и имя юзера. После, при вставке определенной usb-флэшки, этот файл копируется на нее. Получить нужно следующее, когда вставляется флэшка, должен быть запрос о том, что "надо ли скопировать файл?" и если да, то нужно копировать. Скрипт не допилил, но там все просто, вопрос только в этом:

kopirovaniefaila.CopyFile "C:\FSO\ScriptLog.txt" , Drive + ":\Archive\", OverwriteExisting

, как сделать так, чтобы файл копировался, буква флэшки на каждом компе разная, поэтому приходится вот так вот изгаляться.

4

Re: VBScript: Копирование файла с неизвестной буквой диска

Ну, например, опять же в цикле проверять наличие директории (признак нужной флешки) или серийный номер. Если условие выполняется, тот Drive из цикла и используем.

5

Re: VBScript: Копирование файла с неизвестной буквой диска

Может я не правильно выразился.... Не работает сама строка в моем посте выше.

6 (изменено: Rumata, 2012-08-24 18:47:45)

Re: VBScript: Копирование файла с неизвестной буквой диска

SNR93 пишет:

Не работает сама строка в моем посте выше.

Вы проверяли наличие исходного файла по этому пути, правильность нахождения имени целевого диска, присутствие целевого каталога? А флешка открыта на запись?!

SNR93 пишет:

как сделать так, чтобы файл копировался, буква флэшки на каждом компе разная

Запускайте скрипт с самой флешки. Так он будет знать куда копировать.


:: Это пакетный скрипт
@copy /b C:\FSO\ScriptLog.txt %~d0\Archive\
( 2 * b ) || ! ( 2 * b )

7

Re: VBScript: Копирование файла с неизвестной буквой диска

SNR93 пишет:

но там все просто

Ну если просто, то так:


Set objWMI = GetObject("winmgmts:\\.\root\cimv2")
'..........................................................
' здесь получаете DeviceID флешки из Win32_DiskDrive - наверняка используете при извлечении серийника
'..........................................................
Set wmiDiskPartitions = objWMI.ExecQuery("ASSOCIATORS OF {Win32_DiskDrive.DeviceID='" _
			& DeviceID_Вашей_флешки & "'} WHERE AssocClass = Win32_DiskDriveToDiskPartition")
For Each wmiDiskPartition In wmiDiskPartitions		
		Set wmiLogicalDisks = objWMI.ExecQuery _
				("ASSOCIATORS OF {Win32_DiskPartition.DeviceID='" _
				& wmiDiskPartition.DeviceID & "'} WHERE AssocClass = Win32_LogicalDiskToPartition")
		For Each wmiLogicalDisk In wmiLogicalDisks
			MsgBox "Буква диска: " & wmiLogicalDisk.DeviceID
		Next
	Next

8

Re: VBScript: Копирование файла с неизвестной буквой диска

Rumata пишет:
SNR93 пишет:

Не работает сама строка в моем посте выше.

Вы проверяли наличие исходного файла по этому пути, правильность нахождения имени целевого диска, присутствие целевого каталога? А флешка открыта на запись?!

Файл есть, диск определяется правильно(для этого я и поставил WScript.Echo "Диск " & Drive & " был подключён."), каталог есть и запись на флэшку тоже есть.
Ошибка где то в коде, знаю что так можно делать, но не знаю как правильно создать путь. Мне нужен только этот способ.

SNR93 пишет:

как сделать так, чтобы файл копировался, буква флэшки на каждом компе разная

Запускайте скрипт с самой флешки. Так он будет знать куда копировать.
Так не пойдет, так как это будет проблематично запускать столько раз с флэшки один файл руками, да и авторан на компах выключен.


:: Это пакетный скрипт
@copy /b C:\FSO\ScriptLog.txt %~d0\Archive\

Опять же, авторан выключен, да и хотелось бы обойтись без 1000 скриптов, а всего лишь 1.

9

Re: VBScript: Копирование файла с неизвестной буквой диска

SNR93 пишет:

хотелось бы обойтись без 1000 скриптов, а всего лишь 1.

Это один скрипт, состоящий из одной строки. Вставляете флешку, заходите на нее, запускаете скрипт.

Две цитаты (часть текста выделана мной): 

SNR93 пишет:

Пользователь заходит под определенной учеткой. В момент входа и выхода в учетную запись запускается программа, которая записывает в txt файл дату, время проведенное в системе и имя юзера. После, при вставке определенной usb-флэшки, этот файл копируется на нее.

SNR93 пишет:

Опять же, авторан выключен

Как при вставке определенной флешки и выключенном авторане вы решаете задачу запуска скрипта?

( 2 * b ) || ! ( 2 * b )

10 (изменено: dab00, 2012-08-24 19:41:48)

Re: VBScript: Копирование файла с неизвестной буквой диска

Rumata пишет:

Как при вставке определенной флешки и выключенном авторане вы решаете задачу запуска скрипта?

Наверняка через подписку WMI:

SNR93 пишет:

После, при вставке определенной usb-флэшки, этот файл копируется на нее. Получить нужно следующее, когда вставляется флэшка, должен быть запрос о том, что "надо ли скопировать файл?" и если да, то нужно копировать

появилась флешка - проверили серийник - если он самый - копируем файл. А вот КУДА копировать (буква диска) - код выше.

11

Re: VBScript: Копирование файла с неизвестной буквой диска

Можно использовать и USBDeview.

12

Re: VBScript: Копирование файла с неизвестной буквой диска

Один я не понимаю что тут происходит, давайте заново, без постов выше(кроме основного). Мне нужно поправить скрипт. Код выше, работает все, кроме того, что я не могу сделать путь правильно. Нужная папка на флэшке есть, файл есть на компе. Проблема в том что не известна буква usb-накопителя, поэтому пришлось через vbs скрипт определять букву флэшки, скрипт ее определяет, и делает это правильно, теперь внимание! Нужно из допустим

kopirovaniefaila.CopyFile "C:\FSO\ScriptLog.txt" , "F:\Archive\", OverwriteExisting, где F буква usb флэшки сделать

kopirovaniefaila.CopyFile "C:\FSO\ScriptLog.txt" , Drive + ":\Archive\", OverwriteExisting, где Drive - переменная в которой хранится буква usb - флэшки! Так как сделал я не работает! Нужно сделать рабочий вариант.

13

Re: VBScript: Копирование файла с неизвестной буквой диска

Копихере имеет только два параметра, Вам второй не нужен ибо Вам его не возможно применить
Вам нужен только объект, который описывает назначение" и файл источника - все

Я конечно далек от мысли... (с)

14 (изменено: Flasher, 2012-08-26 00:59:39)

Re: VBScript: Копирование файла с неизвестной буквой диска

SNR93
Бесконечный цикл, да ещё и Drv.IsReady.. Вы систему не боитесь травмировать?
А по поводу вашей проблемы всё просто: переведите переменную объекта коллекции Drives в строковый подтип данных через CStr, Trim и т.п.

smaharbA
Тут не CopyHere, и объект тут FSO, а не Shell.

15 (изменено: smaharbA, 2012-08-27 22:02:10)

Re: VBScript: Копирование файла с неизвестной буквой диска

в сабже как то ни странно - копихере
ааа - не прав, копифайл, был не внимая

Я конечно далек от мысли... (с)

16

Re: VBScript: Копирование файла с неизвестной буквой диска

SNR93  хотелось бы получить некоторые уточнения:
1. Компьютеры связаны локальной сетью? Если да, то можно не морочиться с флешкой, а  просто по сети собрать все файлы на комп админа (достаточно cmd).
2. Что будет делать Ваш скрипт если в компьютер вставят, например, 2 флешки?
3. В Вашем скрипте нет механизма определения "нужной" флешки.

  Чисто академически: используя WMI можно определить не только букву на которую подключилась флешка, но и параметры самой флешки, например, серийный номер оной (готовый способ определить "нужную" флешку). Опять же есть механизм сохранить процедуру идентификации "нужной" флешки и сам скрипт копирования файла в реестре системы что безопаснее хранения скрипта на диске компа, мало того нет необходимости в бесконечном цикле, поскольку система сама стартанет скрипт по событию подключения флешки (это не ауторан с флешки, а описание админом действий самой системы по её подключению). Можно реализовать запрет на использование левых флешек на компах конторы (проверяем серийный номер - если не наша флешка, то сразу же её отключаем или в более мягком варианте натравливаем на неё антивирь, буква уже есть, а авторан еще не работает). Для работы с WMI Microsoft выпустил утилитку scriptomatic, занятная штука позволяет сгенерить практически готовый скрипт.  Очень мощное средство администрирования (и хакинга), как говорится: "Гугл тебе в помощь"

17 (изменено: Jurii, 2012-08-30 14:19:13)

Re: VBScript: Копирование файла с неизвестной буквой диска

Fedor пишет:

2. Что будет делать Ваш скрипт если в компьютер вставят, например, 2 флешки?

Автору можно немного подправить для поиска определённого файла или каталога на этом носителе, чтобы однозначно идентифицировать свою флэшку.

18

Re: VBScript: Копирование файла с неизвестной буквой диска

Поразмыслил над проблемой идентификации флешки. Видится 2 варианта:
1. Серийный номер нужной флешки забитый в скрипте, недостаток - если поменяетя флешка, придётся модифицировать скрипт (а флешек у админа может быть много)
2. Скрытый файл на флешке с определенным содержимым, например, каким-то образом перекрученный серийный номер самой флешки. Даст возможность скрипту идентифицировать нужную флешку, но простое копирование его на другую флешку не сделает её доверенной. Недостаток то же есть - после форматирования флешки главное не забыть сделать её доверенной.

19

Re: VBScript: Копирование файла с неизвестной буквой диска

маленький кусок определит букву подключённой флешки, конечно, если флешка одна, а не много...
далее можно копировать, тем более, что исходное положение файла на компе, как я понял известно...
правда кусок на JS, но для знающих людей переложить на VBs минутное дело

var fsoObj = WScript.CreateObject("Scripting.FileSystemObject");        
drvColl = fsoObj.Drives;                            
coll = new Enumerator(drvColl);
for(coll.moveFirst(); !coll.atEnd(); coll.moveNext())
    {
    i = coll.item();
    if(i.DriveType == 1)
        {
        WScript.Echo("Буква флешки = " + i.DriveLetter);
        }
    }

20

Re: VBScript: Копирование файла с неизвестной буквой диска

Fedor
3. Метка тома == серийный номер ?

21 (изменено: dab00, 2012-09-01 10:53:07)

Re: VBScript: Копирование файла с неизвестной буквой диска

На мой взгляд:


Set objWMI = GetObject("winmgmts:\\.\root\cimv2")
For Each wmiDiskDrive In objWMI.ExecQuery("SELECT * FROM Win32_DiskDrive")
	If wmiDiskDrive.InterfaceType = "USB" Then		
		With wmiDiskDrive
			s = Left(Mid(.PNPDeviceID, InStrRev(.PNPDeviceID, "\") + 1), _
					InStrRev(Mid(.PNPDeviceID, InStrRev(.PNPDeviceID, "\") + 1), "&") - 1)
		End With
		'проверяем серийник
		If  s = Серийник_Целевой_Флешки Then					
			For Each wmiDiskPartition In objWMI.ExecQuery("ASSOCIATORS OF {Win32_DiskDrive.DeviceID='" _
					& wmiDiskDrive.DeviceID & "'} WHERE AssocClass = Win32_DiskDriveToDiskPartition")        				
				For Each wmiLogicalDisk In objWMI.ExecQuery("ASSOCIATORS OF {Win32_DiskPartition.DeviceID='" _
						& wmiDiskPartition.DeviceID & "'} WHERE AssocClass = Win32_LogicalDiskToPartition")
					MsgBox "Серийный номер диска: " & s & vbCrLf & "Буква диска: " & wmiLogicalDisk.DeviceID
				Next
			Next		
		End If
	End If
Next

22

Re: VBScript: Копирование файла с неизвестной буквой диска

Fedor пишет:

SNR93  хотелось бы получить некоторые уточнения:
1. Компьютеры связаны локальной сетью? Если да, то можно не морочиться с флешкой, а  просто по сети собрать все файлы на комп админа (достаточно cmd).
2. Что будет делать Ваш скрипт если в компьютер вставят, например, 2 флешки?
3. В Вашем скрипте нет механизма определения "нужной" флешки.

  Чисто академически: используя WMI можно определить не только букву на которую подключилась флешка, но и параметры самой флешки, например, серийный номер оной (готовый способ определить "нужную" флешку). Опять же есть механизм сохранить процедуру идентификации "нужной" флешки и сам скрипт копирования файла в реестре системы что безопаснее хранения скрипта на диске компа, мало того нет необходимости в бесконечном цикле, поскольку система сама стартанет скрипт по событию подключения флешки (это не ауторан с флешки, а описание админом действий самой системы по её подключению). Можно реализовать запрет на использование левых флешек на компах конторы (проверяем серийный номер - если не наша флешка, то сразу же её отключаем или в более мягком варианте натравливаем на неё антивирь, буква уже есть, а авторан еще не работает). Для работы с WMI Microsoft выпустил утилитку scriptomatic, занятная штука позволяет сгенерить практически готовый скрипт.  Очень мощное средство администрирования (и хакинга), как говорится: "Гугл тебе в помощь"

Скрипт еще не допилен, нет, эти компы не соединены, если вставится 2 флэшки, то скрипт определит, если на флэшке есть нужный файл идентификации, то начнет копировать, если нет, то забьет на нее.

23

Re: VBScript: Копирование файла с неизвестной буквой диска

%~dp0 ни как ?

Я конечно далек от мысли... (с)

24

Re: VBScript: Копирование файла с неизвестной буквой диска

smaharbA пишет:

%~dp0 ни как ?

1) Надо на vbs а не на bat.
2) Писалось выше что это не подходит, но я уже все сделал, спасибо всем что отписались

25

Re: VBScript: Копирование файла с неизвестной буквой диска

Serge Yolkin пишет:

3. Метка тома == серийный номер ?

на мой взгляд не совсем удобно, метка тома отображается в проводнике и её без проблем может изменить простой юзер.