Имя пользователя:
Пароль:
 | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Замена батника на AutoIt

Ответить
Настройки темы
[решено] Замена батника на AutoIt

Аватара для gora

Ушёл из жизни


Сообщения: 6021
Благодарности: 3491


Конфигурация

Профиль | Отправить PM | Цитировать


Требуется заменить .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 скрипта и даже как его динамически создать в скрипте я знаю, интересует полный отказ от батника.

Спасибо.

Отправлено: 19:22, 22-10-2010

 

Аватара для gregaz

Пользователь


Сообщения: 88
Благодарности: 19

Профиль | Отправить PM | Цитировать


Можно сделать такой скриптик : (для 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, 22-10-2010 в 21:40.

Это сообщение посчитали полезным следующие участники:

Отправлено: 20:09, 22-10-2010 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Аватара для gora

Ушёл из жизни


Сообщения: 6021
Благодарности: 3491

Профиль | Отправить PM | Цитировать


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

Отправлено: 20:35, 22-10-2010 | #3


Аватара для gregaz

Пользователь


Сообщения: 88
Благодарности: 19

Профиль | Отправить PM | Цитировать


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

Код: Выделить весь код
#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, 22-10-2010 в 23:07.

Это сообщение посчитали полезным следующие участники:

Отправлено: 21:33, 22-10-2010 | #4


Аватара для gora

Ушёл из жизни


Сообщения: 6021
Благодарности: 3491

Профиль | Отправить PM | Цитировать


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

Отправлено: 22:32, 22-10-2010 | #5


Аватара для gregaz

Пользователь


Сообщения: 88
Благодарности: 19

Профиль | Отправить PM | Цитировать


Цитата 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, 22-10-2010 в 23:47.

Это сообщение посчитали полезным следующие участники:

Отправлено: 23:26, 22-10-2010 | #6


Аватара для gora

Ушёл из жизни


Сообщения: 6021
Благодарности: 3491

Профиль | Отправить PM | Цитировать


Цитата 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, 23-10-2010 в 01:29.


Отправлено: 23:55, 22-10-2010 | #7


Аватара для gregaz

Пользователь


Сообщения: 88
Благодарности: 19

Профиль | Отправить PM | Цитировать


Цитата 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

Последний раз редактировалось gregaz, 23-10-2010 в 07:25.

Это сообщение посчитали полезным следующие участники:

Отправлено: 05:43, 23-10-2010 | #8



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Замена батника на AutoIt

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - Связь батника з инетом Flashbag Скриптовые языки администрирования Windows 1 24-05-2010 14:33
CMD/BAT - Изменение схемы питания и ее параметров из батника alecsandrb Скриптовые языки администрирования Windows 3 28-09-2009 19:00
CMD/BAT - [решено] Запуск программ из батника akrav Скриптовые языки администрирования Windows 16 27-05-2009 00:19
FreeBSD - аналог батника на FreeBSD???? went Общий по FreeBSD 8 13-05-2008 15:48
CMD/BAT - Сложность с написанием батника.... 2. PupsIC Скриптовые языки администрирования Windows 1 16-09-2007 21:03




 
Переход