#Include <File.au3>
Global $File = "Program Files"
;Global $File = @ProgramFilesDir
;Global $File = "C:\Program Files"
Array($File)
Func Array($File)
$List = _FileListToArray($File, '*', 1)
If Not @error Then
For $i = 1 To $List[0]
$t = FileGetTime($File & '\' & $List[$i], 1)
If $t[0] >=2010 And $t[1] >=8 And $t[2] >=18 And $t[3] >=00 Then
ConsoleWrite($File & '\' & $List[$i] & @CR)
FileCopy($File & '\' & $List[$i], "G:\" & $File & '\' & $List[$i],8)
EndIf
Next
EndIf
$List = _FileListToArray($File, '*', 2)
If Not @error Then
For $i = 1 To $List[0]
Array($File & '\' & $List[$i])
Next
EndIf
EndFunc
а если вместо Global $File = "Program Files" поставитьGlobal $File = @ProgramFilesDir или Global $File = "C:\Program Files" например для того чтобы запустить скрипт из другого места то информация на консоль выводится а вот копирования нет
assch сказал(а):Спасибо Redline
Попробую Разобратся.
Не подскажешь как силами Autoit Зафиксировать изменения в реестре?
$sRegBranch="HKEY_CURRENT_USER"
$sOutput=@DesktopDir&"\export.reg"
Run(@SystemDir&'\reg.exe export "'&$sRegBranch&'" "'&$sOutput&'"','',@SW_HIDE)
#Include <File.au3>
Global $File = "C:\"
Global $Text = ""
Array($File)
$file = FileOpen(@ScriptDir & 'file.txt' ,2)
FileWrite($file, $text)
FileClose($file)
Exit
Func Array($File)
$List = _FileListToArray($File, '*', 0)
If Not @error Then
For $i = 1 To $List[0]
$t = FileGetTime($File & '\' & $List[$i], 1)
; If $t[0] >=2010 And $t[1] >=08 And $t[2] >=22 And $t[3] >=10 And $t[4] >=40 And $t[5] >=00 Then
$result = StringTrimLeft($File, 4)
$Text &= $File & '\' & $List[$i] & @CRLF
;ConsoleWrite($result & '\' & $List[$i] & @CR)
DirCopy($File & '\' & $List[$i], @ScriptDir & "&Assch&\" & $result & '\' & $List[$i], 1)
FileCopy($File & '\' & $List[$i], @ScriptDir & "&Assch&\" & $result & '\' & $List[$i],8)
EndIf
Next
EndIf
$List = _FileListToArray($File, '*', 2)
If Not @error Then
For $i = 1 To $List[0]
Array($File & '\' & $List[$i])
Next
EndIf
EndFunc
Но есть интересная деталь некоторые программы при инсталяции некоторые (Новые) файлы ставят в систему с более ранним сроком создания (Интересно как это у них получается?)и соответственно эта функция их не отлавливает. Но правда если программа положит эти файлы в только что созданную папкуэта функция их отловит. Не подскажете как это можно решить?
#include <File.au3>
#include <Array.au3>
Global $aDir[1]
_ArrayAddFileListSubDir($aDir, 'c:\')
_ArrayDisplay($aDir)
; построение файл-листа для папки - автор Amel27
Func _ArrayAddFileListSubDir(ByRef $aGDir, $sPath)
Local $i = UBound($aGDir), $aLDir = _FileListToArray($sPath, '*')
_ArrayAddFileList($aGDir, $sPath)
While $i < UBound($aGDir)
_ArrayAddFileList($aGDir, $aGDir[$i])
$i += 1
WEnd
EndFunc
Func _ArrayAddFileList(ByRef $aGDir, $sPath)
Local $i, $aLDir = _FileListToArray($sPath, '*')
If UBound($aGDir, 0) = 1 And UBound($aLDir, 0) = 1 Then
For $i = 1 To $aLDir[0]
_ArrayAdd($aGDir, $sPath & '\' & $aLDir[$i])
Next
EndIf
EndFunc
assch сказал(а):Если можно не большую подсказку какая функция сравнивает списки и удаляет дубликаты?
Как сравнить две строчки я вроде бы нашёл а вот как сравнить целый список тут у меня затор.
#include <array.au3>
Dim $Array1[19] = [1,2,3,4,5,6,7,8,9,10,9,8,7,6,5,4,3,2,1]
Dim $Array2[5] = [1,2,3,4,5]
$Differece = _Diff($Array1, $Array2, 1)
_ArrayDisplay($Differece) ; Shows a count from 1-10 and back down 10-1 without the 1,2,3,4,5
$String1="1,2,3,4,5,6,7,8,9,10,9,8,7,6,5,4,3,2,1"
$String2="6,7,8,9,10"
$Differece = _Diff($String1, $String2, 0, ",")
_ArrayDisplay($Differece) ; Shows a count up 1-10 and without the 6,7,8,9,10
;=================================================
; Function Name: _Diff($Set1, $Set2 [, $GetAll=0 [, $Delim=Default]])
; Description:: Find values in $Set1 that do not occur in $Set2
; Parameter(s): $Set1 set 1 (1D-array or delimited string)
; $Set2 set 2 (1D-array or delimited string)
; optional: $GetAll 0 - only one occurence of every difference are shown (Default)
; 1 - all differences are shown, allowing duplicates
; optional: $Delim Delimiter for strings (Default use the separator character set by Opt("GUIDataSeparatorChar") )
; Return Value(s): Succes 1D-array of values from $Set1 that do not occur in $Set2
; Failure -1 @error set, that was given as array, isn't 1D-array
; Note: Comparison is case-sensitive! - i.e. Number 9 is different to string '9'!
; Author(s): BugFix ([email protected]) Modified by ParoXsitiC for Faster _Diff (Formally _GetIntersection)
;=================================================
Func _Diff(ByRef $Set1, ByRef $Set2, $GetAll = 0, $Delim = Default)
Local $o1 = ObjCreate("System.Collections.ArrayList")
Local $o2 = ObjCreate("System.Collections.ArrayList")
Local $oUnion = ObjCreate("System.Collections.ArrayList")
Local $oDiff1 = ObjCreate("System.Collections.ArrayList")
Local $oDiff2 = ObjCreate("System.Collections.ArrayList")
Local $tmp, $i
If $GetAll <> 1 Then $GetAll = 0
If $Delim = Default Then $Delim = Opt("GUIDataSeparatorChar")
If Not IsArray($Set1) Then
If Not StringInStr($Set1, $Delim) Then
$o1.Add($Set1)
Else
$tmp = StringSplit($Set1, $Delim, 1)
For $i = 1 To UBound($tmp) - 1
$o1.Add($tmp[$i])
Next
EndIf
Else
If UBound($Set1, 0) > 1 Then Return SetError(1, 0, -1)
For $i = 0 To UBound($Set1) - 1
$o1.Add($Set1[$i])
Next
EndIf
If Not IsArray($Set2) Then
If Not StringInStr($Set2, $Delim) Then
$o2.Add($Set2)
Else
$tmp = StringSplit($Set2, $Delim, 1)
For $i = 1 To UBound($tmp) - 1
$o2.Add($tmp[$i])
Next
EndIf
Else
If UBound($Set2, 0) > 1 Then Return SetError(1, 0, -1)
For $i = 0 To UBound($Set2) - 1
$o2.Add($Set2[$i])
Next
EndIf
For $tmp In $o1
If $o2.Contains($tmp) And Not $oUnion.Contains($tmp) Then $oUnion.Add($tmp)
Next
For $tmp In $o1
If $GetAll Then
If Not $oUnion.Contains($tmp) Then $oDiff1.Add($tmp)
Else
If Not $oUnion.Contains($tmp) And Not $oDiff1.Contains($tmp) Then $oDiff1.Add($tmp)
EndIf
Next
If $oDiff1.Count <= 0 Then Return 0
Local $aOut[$oDiff1.Count]
$i = 0
For $tmp In $oDiff1
$aOut[$i] = $tmp
$i += 1
Next
Return $aOut
EndFunc ;==>_Diff
#Include <File.au3>
Global $Array = ""
_FindFiles('C:', '*')
$Txt = FileOpen('1.txt' ,2)
FileWrite($Txt, $Array)
FileClose($Txt)
Func _FindFiles($sRoot, $sFile)
Local $FileList
$FileList = _FileListToArray($sRoot, $sFile, 0)
If Not @error Then
For $i = 1 To $FileList[0]
$Array &= $sRoot & '\' & $FileList[$i] & @CRLF
Next
EndIf
$FileList = _FileListToArray($sRoot, '*', 2)
If Not @error Then
For $i = 1 To $FileList[0]
_FindFiles($sRoot & '\' & $FileList[$i], $sFile)
Next
EndIf
EndFunc
#Include <File.au3>
#include <Array.au3>
$aReturn = _FileSearch(@ScriptDir, '*.txt')
_ArrayDisplay($aReturn)
;~ $Txt = FileOpen('1.txt' ,2)
;~ _FileWriteFromArray($Txt, $aReturn)
;~ FileClose($Txt)
;~ Sleep(1000)
FileCopy('c:\1.txt', @ScriptDir) ; добавляем новый файлик
;~ FileMove(@ScriptDir&'\1.txt','c:\',1) ; убираем файл
Sleep(1000)
$aReturn_2 = _FileSearch(@ScriptDir, '*.txt')
_ArrayDisplay($aReturn_2)
$Differece = _Diff($aReturn_2, $aReturn) ; первое сравнение при увеличении количества файлов
_ArrayDisplay($Differece)
$Differece_2 = _Diff($aReturn, $aReturn_2) ; второе сравнение при уменьшении количества файлов
_ArrayDisplay($Differece_2)
;$iFlag = 0 - Файлы и папки (по умолчанию)
;$iFlag = 1 - Только файлы
;$iFlag = 2 - Только папки
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
;=================================================
; Function Name: _Diff($Set1, $Set2 [, $GetAll=0 [, $Delim=Default]])
; Description:: Find values in $Set1 that do not occur in $Set2
; Parameter(s): $Set1 set 1 (1D-array or delimited string)
; $Set2 set 2 (1D-array or delimited string)
; optional: $GetAll 0 - only one occurence of every difference are shown (Default)
; 1 - all differences are shown, allowing duplicates
; optional: $Delim Delimiter for strings (Default use the separator character set by Opt("GUIDataSeparatorChar") )
; Return Value(s): Succes 1D-array of values from $Set1 that do not occur in $Set2
; Failure -1 @error set, that was given as array, isn't 1D-array
; Note: Comparison is case-sensitive! - i.e. Number 9 is different to string '9'!
; Author(s): BugFix ([email protected]) Modified by ParoXsitiC for Faster _Diff (Formally _GetIntersection)
;=================================================
Func _Diff(ByRef $Set1, ByRef $Set2, $GetAll = 0, $Delim = Default)
Local $o1 = ObjCreate("System.Collections.ArrayList")
Local $o2 = ObjCreate("System.Collections.ArrayList")
Local $oUnion = ObjCreate("System.Collections.ArrayList")
Local $oDiff1 = ObjCreate("System.Collections.ArrayList")
Local $oDiff2 = ObjCreate("System.Collections.ArrayList")
Local $tmp, $i
If $GetAll <> 1 Then $GetAll = 0
If $Delim = Default Then $Delim = Opt("GUIDataSeparatorChar")
If Not IsArray($Set1) Then
If Not StringInStr($Set1, $Delim) Then
$o1.Add($Set1)
Else
$tmp = StringSplit($Set1, $Delim, 1)
For $i = 1 To UBound($tmp) - 1
$o1.Add($tmp[$i])
Next
EndIf
Else
If UBound($Set1, 0) > 1 Then Return SetError(1, 0, -1)
For $i = 0 To UBound($Set1) - 1
$o1.Add($Set1[$i])
Next
EndIf
If Not IsArray($Set2) Then
If Not StringInStr($Set2, $Delim) Then
$o2.Add($Set2)
Else
$tmp = StringSplit($Set2, $Delim, 1)
For $i = 1 To UBound($tmp) - 1
$o2.Add($tmp[$i])
Next
EndIf
Else
If UBound($Set2, 0) > 1 Then Return SetError(1, 0, -1)
For $i = 0 To UBound($Set2) - 1
$o2.Add($Set2[$i])
Next
EndIf
For $tmp In $o1
If $o2.Contains($tmp) And Not $oUnion.Contains($tmp) Then $oUnion.Add($tmp)
Next
For $tmp In $o1
If $GetAll Then
If Not $oUnion.Contains($tmp) Then $oDiff1.Add($tmp)
Else
If Not $oUnion.Contains($tmp) And Not $oDiff1.Contains($tmp) Then $oDiff1.Add($tmp)
EndIf
Next
If $oDiff1.Count <= 0 Then Return 0
Local $aOut[$oDiff1.Count]
$i = 0
For $tmp In $oDiff1
$aOut[$i] = $tmp
$i += 1
Next
Return $aOut
EndFunc ;==>_Diff
#Include <File.au3>
#include <Array.au3>
Global $Test1 = "Test1.txt"
Global $Test2 = "Test2.txt"
Global $aReturn
Global $aReturn_2
Global $sFilePath1 = '1.txt'
Global $sFilePath2 = '2.txt'
_FileReadToArray($sFilePath1, $aReturn)
_FileReadToArray($sFilePath2, $aReturn_2)
$Differece1 = _Diff($aReturn_2, $aReturn) ; первое сравнение при увеличении количества файлов
$Differece2 = _Diff($aReturn, $aReturn_2) ; второе сравнение при уменьшении количества файлов
$File1 = FileOpen($Test1, 1)
FileClose($File1)
_FileWriteFromArray($Test1, $Differece1, 1) ;записывает в Test1.txt добавленные (разницу) файлы
$File2 = FileOpen($Test2, 1)
FileClose($File2)
_FileWriteFromArray($Test2, $Differece2, 1) ;записывает в Test2.txt удалённые файлы
Func _Diff(ByRef $Set1, ByRef $Set2, $GetAll = 0, $Delim = Default)
Local $o1 = ObjCreate("System.Collections.ArrayList")
Local $o2 = ObjCreate("System.Collections.ArrayList")
Local $oUnion = ObjCreate("System.Collections.ArrayList")
Local $oDiff1 = ObjCreate("System.Collections.ArrayList")
Local $oDiff2 = ObjCreate("System.Collections.ArrayList")
Local $tmp, $i
If $GetAll <> 1 Then $GetAll = 0
If $Delim = Default Then $Delim = Opt("GUIDataSeparatorChar")
If Not IsArray($Set1) Then
If Not StringInStr($Set1, $Delim) Then
$o1.Add($Set1)
Else
$tmp = StringSplit($Set1, $Delim, 1)
For $i = 1 To UBound($tmp) - 1
$o1.Add($tmp[$i])
Next
EndIf
Else
If UBound($Set1, 0) > 1 Then Return SetError(1, 0, -1)
For $i = 0 To UBound($Set1) - 1
$o1.Add($Set1[$i])
Next
EndIf
If Not IsArray($Set2) Then
If Not StringInStr($Set2, $Delim) Then
$o2.Add($Set2)
Else
$tmp = StringSplit($Set2, $Delim, 1)
For $i = 1 To UBound($tmp) - 1
$o2.Add($tmp[$i])
Next
EndIf
Else
If UBound($Set2, 0) > 1 Then Return SetError(1, 0, -1)
For $i = 0 To UBound($Set2) - 1
$o2.Add($Set2[$i])
Next
EndIf
For $tmp In $o1
If $o2.Contains($tmp) And Not $oUnion.Contains($tmp) Then $oUnion.Add($tmp)
Next
For $tmp In $o1
If $GetAll Then
If Not $oUnion.Contains($tmp) Then $oDiff1.Add($tmp)
Else
If Not $oUnion.Contains($tmp) And Not $oDiff1.Contains($tmp) Then $oDiff1.Add($tmp)
EndIf
Next
If $oDiff1.Count <= 0 Then Return 0
Local $aOut[$oDiff1.Count]
$i = 0
For $tmp In $oDiff1
$aOut[$i] = $tmp
$i += 1
Next
Return $aOut
EndFunc
А Framework не установлен, а без него функция на основе хэшей почему то выдаёт ошибку.Как только ставишь Framework всё начинает работать. Даже если сделать корректно у этой функции экзешник с установленным Framework ,то всё равно этот экзешник без Framework работать не будет.