Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] Замена батника на AutoIt (http://forum.oszone.net/showthread.php?t=189091)

gora 22-10-2010 19:22 1524995

Замена батника на AutoIt
 
Требуется заменить .bat файл на AutoIt скрипт.
Код:

SETLOCAL enabledelayedexpansion
For %%o In (C D E F G H I J K L M N O P Q R S T U V W X Y Z) Do (
 For /F "skip=5 tokens=3*" %%a In ('Dir "%%o:\" /-C /A:D') Do (
  For /F "skip=7 tokens=3*" %%i In ('Dir "%%o:\%%b" /-C /A:D') Do (
  If "%%j"=="i386" (
    If Exist "%%o:\%%b\%%j\filterpipelineprintproc.dll" (
    RD /S /Q "%%o:\%%b"
    GoTo _del
    )
  )
  )
 )
)
:_del
For /F "UseBackQ Delims=" %%a  In (`Dir "%TMP%" /B /O:N 2^>nul`) Do (
 Set file1=%%a
 Set file2=!file1:~0,3!
 Set file3=!file1:~0,12!
 Set file4=!file1:~0,9!
 If !file2!==dd_ Del /F /Q "%TMP%\%%a"
 If !file3!==ASPNETSetup_ Del /F /Q "%TMP%\%%a"
 If !file4!==Microsoft Del /F /Q "%TMP%\%%a"
)

Батник решает две задачи:
1 Поиск в корне всех дисков компьютера папки с произвольным именем (каждый раз разное) и удаление этой папки. Признаком для идентификации этой папки является одна из вложенных в нее папок i386, содержащая файл filterpipelineprintproc.dll.
2 Удаление из папки %TMP% всех файлов начинающихся на: dd_, ASPNETSetup_, Microsoft.

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

Спасибо.

gregaz 22-10-2010 20:09 1525036

Можно сделать такой скриптик : (для 1- й задачи)

Код:

#Include<File.au3>

$sFolderName="i386"
$sFileName="filterpipelineprintproc.dll"
$aDrive= DriveGetDrive( "all" )

For $i=1 To UBound($aDrive)-1
        $aFolderList=_FileListToArray($aDrive[$i], "*", 2)
        If Not IsArray($aFolderList) Then ContinueLoop
        For $j=1 To UBound($aFolderList)-1
                $aChildFolderList=_FileListToArray($aDrive[$i] & "\" & $aFolderList[$j],$sFolderName, 2); !!!!!!!!!!!!!!!!!!!!!!!!!!!!!
                If Not IsArray($aChildFolderList) Then ContinueLoop
                For $k=1 To UBound($aChildFolderList)-1
                        $aFileList=_FileListToArray($aDrive[$i] & "\" & $aFolderList[$j] & "\" & $aChildFolderList[$k] , $sFileName, 1)
                        If Not IsArray($aChildFolderList) Then ContinueLoop
                        For $jk=1 To UBound($aFileList)-1
                                $sFindedFolder=$aDrive[$i] & "\" & $aFolderList[$j] & "\" &  $aChildFolderList[$k]
                                $sFindedFile=$aFileList[$jk]
                                $iMsg=MsgBox(4,'Удаляемая папка',"Файл :" & $sFileName & @CRLF & "Найден в папке : " &  $sFindedFolder & @CRLF & "Удалить папку ?")
                                ;If $iMsg=6 Then FileRecycle ( $sFindedFolder ); даление
                        Next
                Next
        Next
Next

Sorry, надо внутрь вставить еще 1 цикл для удаления (поправил)
Туда же потом вставить и 2-задачу (если подходит скрипт)

Код:

$aFileList=_FileListToArray(@TempDir, "dd_, ASPNETSetup_, Microsoft*.*", 1)
If Not IsArray($aFileList) Then ContinueLoop
_ArrayDisplay($aFileList)
For $i=1 To UBound($aFileList)-1
        MsgBox(4,'Найденный файл',$aFileList[$i])
        ;FileRecycle ( $aFileList[$i] );
Next


gora 22-10-2010 20:35 1525055

gregaz, не работает.
Сейчас ищет папку X:\i386\filterpipelineprintproc.dll, а надо X:\YYYYYYYYYYYYYYYY\i386\filterpipelineprintproc.dll, где YYYYYYYYYYYYYYYY папка с неизвестным (произвольным) именем.

gregaz 22-10-2010 21:33 1525103

Поправил вроде.
Так будет еще проще и быстрее

Код:

#Include<File.au3>

$sFolderName="i386"
$sFileName="filterpipelineprintproc.dll"
$aDrive= DriveGetDrive( "all" )

For $i=1 To UBound($aDrive)-1
        $aFolderList=_FileListToArray($aDrive[$i], "*", 2)
        If Not IsArray($aFolderList) Then ContinueLoop
        For $j=1 To UBound($aFolderList)-1
                $aChildFolderList=_FileListToArray($aDrive[$i] & "\" & $aFolderList[$j],$sFolderName, 2); !!!!!!!!!!!!!!!!!!!!!!!!!!!!!
                If Not IsArray($aChildFolderList) Then ContinueLoop
                For $k=1 To UBound($aChildFolderList)-1
                        $sFindedFile = FileFindFirstFile($aDrive[$i] & "\" & $aFolderList[$j] & "\" & $aChildFolderList[$k] & "\" & $sFileName) 
                        FileClose($sFindedFile)
                        If $sFindedFile =-1 Then ExitLoop
                        $sFindedFolder=$aDrive[$i] & "\" & $aFolderList[$j] & "\" &  $aChildFolderList[$k]
                        $iMsg=MsgBox(4,'Удаляемая папка',"Файл :" & $sFileName & @CRLF & "Найден в папке : " &  $aDrive[$i] _
                                & "\" & $aFolderList[$j] & "\" & $aChildFolderList[$k] & @CRLF & "Удалить папку ?"    & @CRLF &  $aDrive[$i] & "\" & $aFolderList[$j])
                        ;If $iMsg=6 Then FileRecycle ( $aDrive[$i] & "\" & $aFolderList[$j] ); при удалении  расскомментировать
                Next
        Next
Next


gora 22-10-2010 22:32 1525144

Цитата:

Цитата gregaz
Кстати удаление лучше вынести из цикла ? »

Первая часть работает. Правда из поста 2. Из поста 4 не работает: (Error: "ExitLoop/ContinueLoop" statements only valid from inside a For/Do/While loop.)
Аналогичная ошибка и во второй задаче.
Назначение цикла (For $jk=1) мне не очень ясно, т.к., нужно удалять только одну папку (второй такой быть не может) и она уже определена вне этого цикла ($aDrive[$i] & "\" & $aFolderList[$j])

gregaz 22-10-2010 23:26 1525195

Цитата:

Цитата gora
Назначение цикла (For $jk=1) мне не очень ясно, т.к., нужно удалять только одну папку »

Действительно .Это осталось от 1 варианта

Код:

#Include<File.au3>

$sFolderName="i386"
$sFileName="filterpipelineprintproc.dll"
$aDrive= DriveGetDrive( "all" )

For $i=1 To UBound($aDrive)-1
        $aFolderList=_FileListToArray($aDrive[$i], "*", 2)
        If Not IsArray($aFolderList) Then ContinueLoop
        For $j=1 To UBound($aFolderList)-1
                $aChildFolderList=_FileListToArray($aDrive[$i] & "\" & $aFolderList[$j],$sFolderName, 2); !!!!!!!!!!!!!!!!!!!!!!!!!!!!!
                If Not IsArray($aChildFolderList) Then ContinueLoop
                $sFindedFile = FileFindFirstFile($aDrive[$i] & "\" & $aFolderList[$j] & "\" & $aChildFolderList[1] & "\" & $sFileName) 
                FileClose($sFindedFile)
                If $sFindedFile =-1 Then ExitLoop
                $sFindedFolder=$aDrive[$i] & "\" & $aFolderList[$j] & "\" &  $aChildFolderList[1]
                $iMsg=MsgBox(4,'Удаляемая папка',"Файл :" & $sFileName & @CRLF & "Найден в папке : " &  $aDrive[$i] _
                        & "\" & $aFolderList[$j] & "\" & $aChildFolderList[1] & @CRLF & "Удалить папку ?"    & @CRLF &  $aDrive[$i] & "\" & $aFolderList[$j])
                If $iMsg=6 Then FileRecycle ( $aDrive[$i] & "\" & $aFolderList[$j] ); при удалении  расскомментировать
        Next
Next



Код:


$aFileList=_FileListToArray(@TempDir, "dd_, ASPNETSetup_, Microsoft*.*", 1)
If Not IsArray($aFileList) Then Exit
_ArrayDisplay($aFileList)
For $i=1 To UBound($aFileList)-1
        MsgBox(4,'Найденный файл',$aFileList[$i])
        ;FileRecycle ( $aFileList[$i] );
Next

И такой вариант :
Код:


#Include<File.au3>

$sFolderName="i386"
$sFileName="filterpipelineprintproc.dll"
$aDrive= DriveGetDrive( "all" )

For $i=1 To UBound($aDrive)-1
        $aFolderList=_FileListToArray($aDrive[$i], "*", 2)
        If Not IsArray($aFolderList) Then ContinueLoop
        For $j=1 To UBound($aFolderList)-1
                $sFindedFolder = FileFindFirstFile($aDrive[$i] & "\" & $aFolderList[$j] & "\" & $sFolderName)
                FileClose($sFindedFolder)
                        If $sFindedFolder = -1 Then ContinueLoop
                $sFindedFile = FileFindFirstFile($aDrive[$i] & "\" & $aFolderList[$j] & "\" & $sFolderName& "\" & $sFileName)
                FileClose($sFindedFile)
                If $sFindedFile =-1 Then ContinueLoop
                $sFindedFolder=$aDrive[$i] & "\" & $aFolderList[$j]
                $iMsg=MsgBox(4,'Удаляемая папка',"Файл :" & $sFileName & @CRLF & "Найден в папке : " &  $aDrive[$i] _
                        & "\" & $aFolderList[$j] & "\" & $sFolderName & @CRLF & "Удалить папку ?"    & @CRLF &  $aDrive[$i] & "\" & $aFolderList[$j])
                If $iMsg=6 Then FileRecycle ( $aDrive[$i] & "\" & $aFolderList[$j] ); при удалении  расскомментировать
        Next
Next


gora 22-10-2010 23:55 1525222

Цитата:

Цитата gregaz
Код:
$aFileList=_FileListToArray(@TempDir, "dd_, ASPNETSetup_, Microsoft*.*", 1)
If Not IsArray($aFileList) Then Exit
_ArrayDisplay($aFileList)
For $i=1 To UBound($aFileList)-1
MsgBox(4,'Найденный файл',$aFileList[$i])
;FileRecycle ( $aFileList[$i] );
Next »

Не работает. Добавил #include <Array.au3> , но все равно не работает. Начинает работать только если оставлю только один вариант видов файлов, например:
Код:

$aFileList=_FileListToArray(@TempDir, "dd_*.*", 1)
С группой работать не хочет.

PS
Все оказалось проще:
Код:

FileDelete(@TempDir & "\dd_*.*")
FileDelete(@TempDir & "\Microsoft*.*")
FileDelete(@TempDir & "\ASPNETSetup_*.*")

:)

gregaz 23-10-2010 05:43 1525316

Цитата:

Цитата gora
С группой работать не хочет »

Да , похоже функция не поддерживает групповой шаблон
Цитата:

Цитата gora
Все оказалось проще: »

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

Код:

...
$sFilePath=@TempDir & "\" & $aFileList[$i]
If StringRegExp($sFilePath,"(dd_| ASPNETSetup_| Microsoft)",0)=1 Then    ...

Кстати более простой вариант 1-й задачи :
Код:

#Include<File.au3>
$sFolderName="i386"
$sFileName="filterpipelineprintproc.dll"
$aDrive= DriveGetDrive( "all" )
For $i=1 To UBound($aDrive)-1
        $aFolderList=_FileListToArray($aDrive[$i], "*", 2)
        If Not IsArray($aFolderList) Then ContinueLoop
        For $j=1 To UBound($aFolderList)-1
                $sFolderPath=$aDrive[$i] & "\" & $aFolderList[$j]
               
                If FileExists($sFolderPath & "\" & $sFolderName& "\" & $sFileName) Then
                        $iMsg=MsgBox(4,'',"Файл :" & $sFileName & @CRLF & "Найден в папке : " &  $sFolderPath & "\" & $sFolderName & @CRLF & "Удалить папку ?" & @CRLF &  $sFolderPath)
                        If $iMsg=6 Then FileRecycle ( $sFolderPath )
                EndIf
        Next
Next



Время: 09:25.

Время: 09:25.
© OSzone.net 2001-