-
AutoIt
(
http://forum.oszone.net/forumdisplay.php?f=103)
Замена батника на 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 скрипта и даже как его динамически создать в скрипте я знаю, интересует полный отказ от батника.
Спасибо.
|
Можно сделать такой скриптик : (для 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
|
gregaz, не работает.
Сейчас ищет папку X:\i386\filterpipelineprintproc.dll, а надо X:\YYYYYYYYYYYYYYYY\i386\filterpipelineprintproc.dll, где YYYYYYYYYYYYYYYY папка с неизвестным (произвольным) именем.
|
Поправил вроде.
Так будет еще проще и быстрее
Код:
#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
|
Цитата:
Цитата gregaz
Кстати удаление лучше вынести из цикла ? »
|
Первая часть работает. Правда из поста 2. Из поста 4 не работает: (Error: "ExitLoop/ContinueLoop" statements only valid from inside a For/Do/While loop.)
Аналогичная ошибка и во второй задаче.
Назначение цикла (For $jk=1) мне не очень ясно, т.к., нужно удалять только одну папку (второй такой быть не может) и она уже определена вне этого цикла ( $aDrive[$i] & "\" & $aFolderList[$j])
|
Цитата:
Цитата 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
|
Цитата:
Цитата 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_*.*")
:)
|
Цитата:
Цитата 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.
© OSzone.net 2001-