; Параметр передаваемый скрипту должен иметь вид
; Имя_диска_Х:Имя_диска_зеркала\Путь к файлу или папке
; Под "Имя_диска_Х" и "Имя_диска_зеркала" подразумевается имя тома
; При указании зеркала, после Имя_диска_Х обязательно ставится двоеточие!
; Если файл хранится только на одном диске, двоеточие и "Имя_диска_зеркала" - опускаются
;
; Скрипт применим не только для USB устройств, но и для E-SATA
$sLabel_1 = '' ;имя первого диска, который ищем
$sLabel_2 = '' ;имя второго диска, который ищем
$sLabel = ''
$sTempLabel = ''
$sPath = '' ; путь к папке или файлу, который ищем
$sTempPath = ''
$fYes = False
$fWork = True
$fExistOnFirstDrive = True
$iPass = 0
$iFirstPos = 0
$iSecondPos = 0
; здесь парсим параметр командной строки
If $CMDLine[0] <> 1 Then
Exit MsgBox(4096, "Ошибка", 'Неверно указан параметр!' & @LF & 'Проверьте, возможно в пути к папке(файлу) имеются пробелы...' & @LF & 'Тогда заключите параметр в кавычки.')
ElseIf $CMDLine[0] = 1 Then
If $CMDLine[1] = "/?" Then
MsgBox(32, "Справка", 'Параметр передаваемый скрипту должен иметь вид:' & @LF & @LF & _
'"Имя_диска_Х:Имя_диска_зеркала\Путь к файлу или папке."' & @LF & @LF & _
'Заключать параметр в кавычки обязательно, так как в пути к папке(файлу) могут встречаться пробелы' & @LF & _
'Под "Имя_диска_Х" и "Имя_диска_зеркала" подразумевается имена томов где нужно икать папку (файл).' & @LF & _
'При указании зеркала, после Имя_диска_Х обязательно ставится двоеточие!' & @LF & @LF & _
'Например:' & @LF & @LF & _
'"Том1:Том2\Каталог1\Подкатлог\Файл.txt"' & @LF & @LF & _
'Если файл хранится только на одном диске, двоеточие и "Имя_диска_зеркала" - опускаются' & @LF & @LF & _
'Например:' & @LF & @LF & _
'"Том1\Каталог1\Подкатлог\Файл.txt"')
Exit
ElseIf $CMDLine[1] <> "/?" Then
$iFirstPos = StringInStr($CMDLine[1], ":")
$iSecondPos = StringInStr($CMDLine[1], "\")
; указан зеркальный диск
IF $iFirstPos <> 0 Then
$sLabel_1 = StringLeft($CMDLine[1], $iFirstPos - 1)
$sLabel_2 = StringMid($CMDLine[1], $iFirstPos + 1, $iSecondPos - ($iFirstPos + 1))
; если в параметре указано два одинаковых имени тома, считаем, что второго нет
If $sLabel_2 = $sLabel_1 Then
$sLabel_2 = "Зеркала нет"
EndIf
$sPath = StringRight($CMDLine[1], StringLen($CMDLine[1]) - ($iSecondPos - 1))
; не указан зеркальный диск
ElseIf $iFirstPos = 0 Then
$sLabel_1 = StringLeft($CMDLine[1], $iSecondPos - 1)
$sLabel_2 = "Зеркала нет"
$sPath = StringRight($CMDLine[1], StringLen($CMDLine[1]) - ($iSecondPos - 1))
EndIf
EndIf
EndIf
$sTempLabel = $sLabel_1
While ($fWork)
$aDrives = DriveGetDrive('all')
If Not @error Then
For $i = 1 To $aDrives[0]
$sLabel = DriveGetLabel($aDrives[$i])
If $sLabel = $sTempLabel Then
$fYes = True
$sTempPath = $aDrives[$i] & $sPath
ExitLoop
Else
$fYes = False
EndIf
Next
Else
MsgBox(16, 'Ошибка', 'Ошибка')
$fWork = False
EndIf
If $fYes Then ; нашли диск
If FileExists($sTempPath) Then
If StringInStr(FileGetAttrib($sTempPath), 'D') Then
ShellExecute($sTempPath)
$fWork = False
Else
$sTempPath = StringRegExpReplace($sTempPath, '\\[^\\]*$', '')
ShellExecute($sTempPath)
$fWork = False
EndIf
Else
If ($iPass = 0 And $sLabel_2 = "Зеркала нет") Then
MsgBox(16, 'Внимание', 'Единственный указанный диск "' & $sTempLabel & '" подключен, но на нем отсутствует папка(файл):' & @LF & @LF & $sTempPath)
$fWork = False
ElseIf ($iPass = 0 And $sLabel_2 <> "Зеркала нет") Then
MsgBox(48, 'Внимание', 'Первый указанный диск "' & $sTempLabel & '" подключен, но на нем отсутствует папка(файл):' & @LF & @LF & $sTempPath)
$fExistOnFirstDrive = False ; на первом диске папка(файл) не найдена
$iPass += 1 ; если на первом диске папка(файл) не найдена делаем второй проход и ищем на зеркале
$sTempLabel = $sLabel_2
ContinueLoop
ElseIf ($fExistOnFirstDrive And $iPass = 1 And $sLabel_2 <> "Зеркала нет") Then
If MsgBox(37, 'Внимание', 'Первый указанный диск "' & $sLabel_1 & '" не был подключен.' & @LF & _
'Зеркальный диск "' & $sLabel_2 & '" подключен, но на нем отсутствует папка(файл):' & @LF & @LF & $sTempPath & @LF & _
@CRLF & 'Попробуйте подключить первый диск "' & $sLabel_1 & '" и нажмите "Повтор",' & @CRLF & _
'или нажмите "Отмена" для выхода.') = 4 Then
$iPass = 0
$sTempLabel = $sLabel_1
$fYes = false
ContinueLoop
Else
$fWork = False
EndIf
ElseIf ((Not $fExistOnFirstDrive) And $iPass = 1 And $sTempLabel = $sLabel_2) Then
MsgBox(16, 'Внимание', 'Ни на первом диске "' & $sLabel_1 & '",' & @LF & 'ни на втором диске "' & $sLabel_2 & '"' & @LF & _
'нет папки(файла):' & @LF & @LF & $sPath & @LF & @CRLF & 'Проверьте правильность заданного параметра.')
$fWork = False
EndIf
EndIf
ElseIf ((Not $fYes) And $iPass = 0 And $sLabel_2 <> "Зеркала нет") Then ; первого диска не нашли, ищем второй (если он есть)
MsgBox(48, 'Внимание', 'Первый указанный диск "' & $sTempLabel & '" не подключен')
$sTempLabel = $sLabel_2
$iPass += 1
ContinueLoop
ElseIf ((Not $fYes) And $iPass = 0 And $sLabel_2 = "Зеркала нет") Then ; единственного диска не нашли
If MsgBox(37, 'Внимание', 'Указанный диск "' & $sTempLabel & '" не подключен, а зеркала нет' & @LF & _
@CRLF & 'Попробуйте подключить этот диск "' & $sLabel_1 & '" и нажмите "Повтор",' & @CRLF & _
'или нажмите "Отмена" для выхода.') = 4 Then
$iPass = 0
$sTempLabel = $sLabel_1
ContinueLoop
Else
$fWork = False
EndIf
ElseIf ((Not $fExistOnFirstDrive) And $iPass = 1 And $sLabel_2 <> "Зеркала нет") Then
If MsgBox(37, 'Внимание', 'Первый указанный диск "' & $sLabel_1 & '" подключен, но на нем отсутствует папка(файл):' & @LF & @LF & $sTempPath & @LF & @LF & _
'Зеркальный диск "' & $sLabel_2 & '" не был подключен.' & @LF & _
@CRLF & 'Попробуйте подключить зеркальный диск "' & $sLabel_2 & '" и нажмите "Повтор",' & @CRLF & _
'или нажмите "Отмена" для выхода.') = 4 Then
$iPass = 1
$sTempLabel = $sLabel_2
$fYes = false
ContinueLoop
Else
$fWork = False
EndIf
Else ; не нашли ни одного диска
If MsgBox(37, 'Внимание', 'Диски "' & $sLabel_1 & '" и "' & $sLabel_2 & '" не подключены.' & _
@CRLF & 'Подключите один из них и нажмите "Повтор",' & @CRLF & _
'или нажмите "Отмена" для выхода.') = 4 Then
$iPass = 0
$sTempLabel = $sLabel_1
ContinueLoop
Else
$fWork = False
EndIf
EndIf
WEnd