[решено] Замена батника на AutoIt

Ответить
Аватара пользователя
gora

[решено] Замена батника на AutoIt

Сообщение gora »

Требуется заменить .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

Re: [решено] Замена батника на AutoIt

Сообщение gregaz »

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





Код:

Код: Выделить всё

#Include
$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

Re: [решено] Замена батника на AutoIt

Сообщение gora »

gregaz, не работает.

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

Re: [решено] Замена батника на AutoIt

Сообщение gregaz »

Поправил вроде.

Так будет еще проще и быстрее





Код:

Код: Выделить всё

#Include
$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

Re: [решено] Замена батника на AutoIt

Сообщение gora »

Цитата gregaz:



Кстати удаление лучше вынести из цикла ?
[решено] Замена батника на AutoIt




Первая часть работает. Правда из поста 2. Из поста 4 не работает: (Error: "ExitLoop/ContinueLoop" statements only valid from inside a For/Do/While loop.)

Аналогичная ошибка и во второй задаче.

Назначение цикла (For $jk=1) мне не очень ясно, т.к., нужно удалять только одну папку (второй такой быть не может) и она уже определена вне этого цикла ($aDrive[$i] & "\" & $aFolderList[$j])
Аватара пользователя
gregaz

Re: [решено] Замена батника на AutoIt

Сообщение gregaz »

Цитата gora:



Назначение цикла (For $jk=1) мне не очень ясно, т.к., нужно удалять только одну папку
[решено] Замена батника на AutoIt




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





Код:

Код: Выделить всё

#Include
$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
$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

Re: [решено] Замена батника на AutoIt

Сообщение gora »

Цитата 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
[решено] Замена батника на AutoIt




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

Код:

Код: Выделить всё

$aFileList=_FileListToArray(@TempDir, "dd_*.*", 1)

С группой работать не хочет.



PS

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

Код:

Код: Выделить всё

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

Изображение
Аватара пользователя
gregaz

Re: [решено] Замена батника на AutoIt

Сообщение gregaz »

Цитата gora:



С группой работать не хочет
[решено] Замена батника на AutoIt




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


Цитата gora:



Все оказалось проще:
[решено] Замена батника на AutoIt




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





Код:

Код: Выделить всё

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

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



Код:

Код: Выделить всё

#Include
$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
Ответить

Вернуться в «AutoIt»