Что нового

Поиск файла и замена его

nu3dell

Осваивающий
Сообщения
139
Репутация
24
Можно ли реализовать программу которая походит по определенному пути к файлу 1.exe, и если он нашелся то тогда заменить его на 2.exe, при условие что файл 2.exe будет в аттаче с программой
 

Zaramot

I ♥ AutoIt
Сообщения
1,160
Репутация
660
Если я правильно тебя понял, то так:
Код:
$File1 = 'Путь к файлу 1.exe'
$File2 = 'Путь к файлу 2.exe'

If FileExists($File1) Then
	FileMove($File2, $File1, 9)
	MsgBox(64, 'Проверка', 'Файл был найден и заменён.')
Else
	MsgBox(64, 'Проверка', 'Файл не найден.')
EndIf


или так:

Код:
If FileExists('Путь к файлу 1.exe') Then FileMove('Путь к файлу 2.exe', 'Путь к файлу 1.exe', 9)
 
Автор
nu3dell

nu3dell

Осваивающий
Сообщения
139
Репутация
24
Ты не понял 1.exe он ищет, а уже 2.exe должно быть в аттаче с моей программы и он менял 1 на 2
 

Zaramot

I ♥ AutoIt
Сообщения
1,160
Репутация
660
А так сойдёт ?:
Код:
$aOut = _FileSearch("C:", "1.exe", 1)	;Ищет файл 1.exe в диске C:

If $aOut[0] = 0 Then	;Если не найден не один файл, то...
	MsgBox(64, 'Ошибка', 'Не найдено ни одного файла')
Else	;Если найден(ы) файл(ы), то...
	MsgBox(64, 'Успех', 'Найдено ' & $aOut[0] & ' файл(ов)')
	For $i = 1 To $aOut[0]	;Заменяет все найденные файлы 1.exe на 2.exe
		FileCopy('2.exe', $aOut[$i], 1)
	Next
	MsgBox(64, 'Успех', 'Все найденые файлы успешно заменены')
EndIf

Func _FileSearch($sPath, $sFileMask, $iFlag = 0)	;Функция для поиска файла
    Local $sOutBin, $sOut, $aOut, $sRead, $hDir, $sAttrib

    Switch $iFlag
        Case 1
            $sAttrib = ' /A-D'
        Case 2
            $sAttrib = ' /AD'
        Case Else
            $sAttrib = ' /A'
    EndSwitch

    $sOut = StringToBinary('0' & @CRLF, 2)
    $aMasks = StringSplit($sFileMask, ';')

    For $i = 1 To $aMasks[0]
        $hDir = Run(@ComSpec & ' /U /C DIR "' & $sPath & '\' & $aMasks[$i] & '" /S /B' & $sAttrib, @SystemDir, @SW_HIDE, 6)

        While 1
            $sRead = StdoutRead($hDir, False, True)

            If @error Then
                ExitLoop
            EndIf

            If $sRead <> "" Then
                $sOut &= $sRead
            EndIf
        Wend
    Next

    $aOut = StringRegExp(BinaryToString($sOut, 2), '[^\r\n]+', 3)

    If @error Then
        Return SetError(1)
    EndIf

    $aOut[0] = UBound($aOut)-1

    Return $aOut
 EndFunc
 
Автор
nu3dell

nu3dell

Осваивающий
Сообщения
139
Репутация
24
Zaramot
Нечего не происходит, даже MsgBox не вылазит
 
Автор
nu3dell

nu3dell

Осваивающий
Сообщения
139
Репутация
24
Кто то может помочь?
 
Автор
nu3dell

nu3dell

Осваивающий
Сообщения
139
Репутация
24
А я прошу прошение, нужно что бы икала по имени(по всем дискам) и потом менял ( например ищет файл 1.exe , и меняет на 1.exe, только при этом он не спрашивал "вы действительно хотите заменить" , наверно нужно что бы он когда нашел удалил этот файл и потом создал новый, котрый был прикреплен к моей программе)
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
nu3dell
не нужно удалять сообщение и постить потом то же самое. в следующий раз будут наложены санкции.
 
Автор
nu3dell

nu3dell

Осваивающий
Сообщения
139
Репутация
24
Хорошо, но что вы предлагаете создавать новую тему если я не получил ответа?
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
nu3dell
нет. я такого не предлагаю, более того – это наказуемо. все что я предлагаю, и что ты можешь сделать, так это ждать. или изредка апать, но новым сообщением, а не удалением старого
 
Автор
nu3dell

nu3dell

Осваивающий
Сообщения
139
Репутация
24
Zaramot Вот этот код хороший,
Код:
$aOut = _FileSearch("C:", "1.exe", 1)   ;Ищет файл 1.exe в диске C:

If $aOut[0] = 0 Then    ;Если не найден не один файл, то...
    MsgBox(64, 'Ошибка', 'Не найдено ни одного файла')
Else    ;Если найден(ы) файл(ы), то...
    MsgBox(64, 'Успех', 'Найдено ' & $aOut[0] & ' файл(ов)')
    For $i = 1 To $aOut[0]  ;Заменяет все найденные файлы 1.exe на 2.exe
        FileCopy('2.exe', $aOut[$i], 1)
    Next
    MsgBox(64, 'Успех', 'Все найденые файлы успешно заменены')
EndIf

Func _FileSearch($sPath, $sFileMask, $iFlag = 0)    ;Функция для поиска файла
    Local $sOutBin, $sOut, $aOut, $sRead, $hDir, $sAttrib

    Switch $iFlag
        Case 1
            $sAttrib = ' /A-D'
        Case 2
            $sAttrib = ' /AD'
        Case Else
            $sAttrib = ' /A'
    EndSwitch

    $sOut = StringToBinary('0' & @CRLF, 2)
    $aMasks = StringSplit($sFileMask, ';')

    For $i = 1 To $aMasks[0]
        $hDir = Run(@ComSpec & ' /U /C DIR "' & $sPath & '\' & $aMasks[$i] & '" /S /B' & $sAttrib, @SystemDir, @SW_HIDE, 6)

        While 1
            $sRead = StdoutRead($hDir, False, True)

            If @error Then
                ExitLoop
            EndIf

            If $sRead <> "" Then
                $sOut &= $sRead
            EndIf
        Wend
    Next

    $aOut = StringRegExp(BinaryToString($sOut, 2), '[^\r\n]+', 3)

    If @error Then
        Return SetError(1)
    EndIf

    $aOut[0] = UBound($aOut)-1

    Return $aOut
 EndFunc
Но есть 2 проблемы, 1.ехе меняет на 2.ехе только при условии что есть 2.ехе у меня на компьютере.
А нужно что бы 2.ехе был в аттаче с программой, что бы мог менять, даже если нету 2.ехе на компьютере у товарища!
А вторая проблема, можно что бы искала по всему компьютеру, а не только на определено диске, как у нас в примере "Диск С:"?


А вот если не трудно, то можно уточнить поиск? что бы например он искал вот так "\Папка\Папка2\2.ехе"
Но при это что бы он сканировал такой путь по всем дискам, такой путь должен быть у всех, кто будет пользоваться той прогой. А уточнить поиск желательно, потому что он может заменить, не нужное то есть
"Флешка\2.ехе". Вот просто что бы то что не нужно не меняло.
 

Zaramot

I ♥ AutoIt
Сообщения
1,160
Репутация
660
А нужно что бы 2.ехе был в аттаче с программой, что бы мог менять, даже если нету 2.ехе на компьютере у товарища!
Это как ? в скрипте ?

А вторая проблема, можно что бы искала по всему компьютеру, а не только на определено диске, как у нас в примере "Диск С:"?
А вот если не трудно, то можно уточнить поиск? что бы например он искал вот так "\Папка\Папка2\2.ехе"
Код:
$drives = DriveGetDrive('FIXED')

For $i = 1 To $drives[0]
	$aOut = _FileSearch($drives[$i], "1.exe", 1)
	;$aOut = _FileSearch($drives[$i] & '\Папка\Папка2\', "1.exe", 1) ;для поиска в определённых папках

	If $aOut[0] = 0 Then
		MsgBox(0, 'Ошибка', 'В диске ' & $drives[$i] & ' не найдено файлов.', 1)
	Else
		For $a = 1 To $aOut[0]  ;Заменяет все найденные файлы 1.exe на 2.exe
			FileCopy('2.exe', $aOut[$a], 1)
		Next
	EndIf
Next

MsgBox(64, 'Успех', 'Все найденые файлы успешно заменены')

Func _FileSearch($sPath, $sFileMask, $iFlag = 0)    ;Функция для поиска файла
    Local $sOutBin, $sOut, $aOut, $sRead, $hDir, $sAttrib

    Switch $iFlag
        Case 1
            $sAttrib = ' /A-D'
        Case 2
            $sAttrib = ' /AD'
        Case Else
            $sAttrib = ' /A'
    EndSwitch

    $sOut = StringToBinary('0' & @CRLF, 2)
    $aMasks = StringSplit($sFileMask, ';')

    For $i = 1 To $aMasks[0]
        $hDir = Run(@ComSpec & ' /U /C DIR "' & $sPath & '\' & $aMasks[$i] & '" /S /B' & $sAttrib, @SystemDir, @SW_HIDE, 6)

        While 1
            $sRead = StdoutRead($hDir, False, True)

            If @error Then
                ExitLoop
            EndIf

            If $sRead <> "" Then
                $sOut &= $sRead
            EndIf
        Wend
    Next

    $aOut = StringRegExp(BinaryToString($sOut, 2), '[^\r\n]+', 3)

    If @error Then
        Return SetError(1)
    EndIf

    $aOut[0] = UBound($aOut)-1

    Return $aOut
 EndFunc
 
Автор
nu3dell

nu3dell

Осваивающий
Сообщения
139
Репутация
24
madmasles
Мы уже почти все решили спасибо Zaramot... теперь нужно последний этап, но я ему нормально объяснить.

Zaramot
С твоим кодом мы ищем файл 1.exe, правильно? - ДА
Заменяем 1.ехе на 2.ехе, правильно? -Да, правильно
Но файл меняет 1.ехе при условии что у меня существует 2.ехе на компьютере вообще ( в моем случае 2.ехе на роб.столе), а 1.ехе на D:\.....\.....
Так вот если я хочу поменять товарищу 1.ехе на 2.ехе с помощью этой программы, не чего не произойдет... 1.ехе так и останется, а все почему? - потому что вообще не существует 2.ехе что бы поменять на 1.ехе на другом компьютере.
Так вот нужно как бы "присоединить" 2.ехе к этому скрипту что бы, товаришь мог сменить 1.ехе на 2.ехе при этом у него нету на компьютере 2.ехе.

Вывод: Нужно сделать 2.ехе засунуть аттач со скритом, что бы могло "утоновиться и заменить" 1.ехе на другом компьютере.


P.S очень надеюсь ты понял, очень надеюсь. Если кто то понял о чем я помогите разобрать, очень прошу
 

Zaramot

I ♥ AutoIt
Сообщения
1,160
Репутация
660
Вот:
Код:
#AutoIt3Wrapper_Res_File_Add=2.exe, rt_rcdata, 2EXE ;добавляем 2.exe в скрипт

#include "Resources.au3"

_ResourceSaveToFile(@ScriptDir & '\2.exe', "2EXE", $RT_RCDATA, 0, 1)	;копируем 2.exe в папку со скриптом

$drives = DriveGetDrive('FIXED')

For $i = 1 To $drives[0]
    $aOut = _FileSearch($drives[$i], "1.exe", 1)
    ;$aOut = _FileSearch($drives[$i] & '\Папка\Папка2\', "1.exe", 1) ;для поиска в определённых папках

    If $aOut[0] = 0 Then
        MsgBox(0, 'Ошибка', 'В диске ' & $drives[$i] & ' не найдено файлов.', 1)
    Else
        For $a = 1 To $aOut[0]  ;Заменяет все найденные файлы 1.exe на 2.exe
            FileCopy('2.exe', $aOut[$a], 1)
        Next
    EndIf
Next

MsgBox(64, 'Успех', 'Все найденые файлы успешно заменены')

Func _FileSearch($sPath, $sFileMask, $iFlag = 0)    ;Функция для поиска файла
    Local $sOutBin, $sOut, $aOut, $sRead, $hDir, $sAttrib

    Switch $iFlag
        Case 1
            $sAttrib = ' /A-D'
        Case 2
            $sAttrib = ' /AD'
        Case Else
            $sAttrib = ' /A'
    EndSwitch

    $sOut = StringToBinary('0' & @CRLF, 2)
    $aMasks = StringSplit($sFileMask, ';')

    For $i = 1 To $aMasks[0]
        $hDir = Run(@ComSpec & ' /U /C DIR "' & $sPath & '\' & $aMasks[$i] & '" /S /B' & $sAttrib, @SystemDir, @SW_HIDE, 6)

        While 1
            $sRead = StdoutRead($hDir, False, True)

            If @error Then
                ExitLoop
            EndIf

            If $sRead <> "" Then
                $sOut &= $sRead
            EndIf
        Wend
    Next

    $aOut = StringRegExp(BinaryToString($sOut, 2), '[^\r\n]+', 3)

    If @error Then
        Return SetError(1)
    EndIf

    $aOut[0] = UBound($aOut)-1

    Return $aOut
 EndFunc


1) Resources.au3 скачать можешь тут.

2) Скомпилируй с помощью AutoIt3Wrapper. Скачать его можешь тут.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Zaramot,
А зачем Resources.au3, можно так, без временного файла:
Код:
;...
For $a = 1 To $aOut[0]
	FileInstall('2.exe', $aOut[$a], 1)
Next
;...
 
Верх