ViciousXUSMC Posted July 17, 2014 Share Posted July 17, 2014 I am automating a complicated install process for a legacy program. Part of that install is Oracle 9i, during that install we get some random .dll errors that I know how to eleminate. I need to copy a DLL from the Windows machine into the temporary installation directory while the installer is running. I have done this before but that Oracle installer always used the same name for the temp install directory, while this one always adds a timestamp to the folder making it "random" Example install directory: C:UsersUserNameAppDataLocalTempOraInstall2014-07-16_11-55-22AM My old script was simple enough: FileCopy("C:\Windows\System32\psapi.dll", @LocalAppDataDir & "\temp\OraInstall*\", 9) FileSetAttrib( @LocalAppDataDir & "\temp\OraInstall\psapi.dll", "+R") How can I do a simple modification of this so that it will pick up the random timestamp and choose the newest folder? I already tried my best playing with FileFindFirstFile and _FileListToArray as I feel one of those is the key to an easy fix but I just could not get it working. Link to comment Share on other sites More sharing options...
Jfish Posted July 17, 2014 Share Posted July 17, 2014 There is probably a better way but an array of all dirs that is looped against FileGetTime would at least let you sort them by time to find the most recent dir. Then you could double check it with stringinstr to make sure it contains something like this: OraInstall2014-07-16. Build your own poker game with AutoIt: pokerlogic.au3 | Learn To Program Using FREE Tools with AutoIt Link to comment Share on other sites More sharing options...
javiwhite Posted July 17, 2014 Share Posted July 17, 2014 (edited) Hey Vicious, You could use a FileFindNextFile search and get the properties of the folders using >Simucal's Get Extended Properties UDF It would look something like this: expandcollapse popup$dir = "c:\TEMP\" $hSearch = FileFindFirstFile($dir & *.*) if $hSearch = -1 then exit local $i = 0,$hFileTime[1][2] while 1 $hFileName = FileFindNextFile($hSearch) if @error then exitloop _ExpandArray($hFileTime,2) $hFile[$i][0] = $hFileName $hFile[$i][1] = _GetExtProperty($dir & $hFileName,2) $i+= 1 Next $MostRecent = $hFile[0][1] for $i=1 to uBound($hFile) if $hFile[$i][1] > $MostRecent then $MostRecent = $hFile[$i][1] $ArrayRow = $i endif next msgbox(0,"Result","The File you're looking for is " & $hFile[$ArrayRow][0]) func _ExpandArray(ByRef $iArray,$dimensions = 1,$update=1,$newval=uBound($iArray)+1) if not IsArray($iArray) then return SetError(1,0,-1) if $dimensions < 1 then Return SetError(2,0,-1) local $tArray = $iArray If $dimensions == 1 Then ReDim $iArray[$newval] for $i = 1 to uBound($tArray) - 1 if $i = uBound($iArray) then exitloop $iArray[$i] = $tArray[$i] Next ElseIf $dimensions == 2 Then if $update==1 Then ReDim $iArray[$newval][uBound($iArray,2)] for $i = 1 to uBound($tArray,1) - 1 if $i = uBound($iArray,1) then ExitLoop for $x = 0 to uBound($tArray,2) - 1 if $x = uBound($iArray,2) then ExitLoop $iArray[$i][$x] = $tArray[$i][$x] Next Next elseif $update==2 Then ReDim $iArray[uBound($iArray,1)][$newval] for $i = 1 to uBound($tArray,1) - 1 for $x = 1 to uBound($tArray,2) - 1 $iArray[$i][$x] = $tArray[$i][$x] Next Next EndIf ElseIf $dimensions == 3 Then if $update==1 Then ReDim $iArray[$newval][uBound($iArray,2)][uBound($iArray,3)] for $i = 1 to uBound($tArray,1) - 1 for $x = 1 to uBound($tArray,2) - 1 for $y = 1 to uBound($tArray,3) - 1 $iArray[$i][$x][$y] = $tArray[$i][$x][$y] Next Next Next ElseIf $update==2 Then ReDim $iArray[uBound($iArray,1)][$newval][uBound($iArray,3)] for $i = 1 to uBound($tArray,1) - 1 for $x = 1 to uBound($tArray,2) - 1 for $y = 1 to uBound($tArray,3) - 1 $iArray[$i][$x][$y] = $tArray[$i][$x][$y] Next Next Next ElseIf $update==3 Then ReDim $iArray[uBound($iArray,1)][uBound($iArray,2)][$newval] for $i = 1 to uBound($tArray,1) - 1 for $x = 1 to uBound($tArray,2) - 1 for $y = 1 to uBound($tArray,3) - 1 $iArray[$i][$x][$y] = $tArray[$i][$x][$y] Next Next Next EndIf Else Return SetError(3,0,-1) EndIf Return uBound($iArray) EndFunc I also threw in my _ExpandArray Function... it isn't documented or anything, as i never really planned for it to be useful for anything more than a script or two, But it's incredibly handy when you need to create an array of which you're not sure the upper bound will be; and in your case, it's probably ideal Hopefully this helps -Javi EDIT: I should mention that I haven't tested this, As I don't have AutoIT installed on this machine, But it should at the very least get you on the right tracks Edited July 17, 2014 by javiwhite give a man an application, and he'll be frustrated for the day, Teach him how to program applications and he'll be frustrated for a lifetime. Link to comment Share on other sites More sharing options...
mikell Posted July 17, 2014 Share Posted July 17, 2014 (edited) #include <File.au3> #include <Array.au3> Local $aFileList = _FileListToArray(@LocalAppDataDir & "\temp\", "OraInstall*", 2, 1) Dim $array[$aFileList[0]][2] For $i = 1 to $aFileList[0] $array[$i-1][0] = $aFileList[$i] $array[$i-1][1] = FileGetTime($aFileList[$i], 1, 1) Next _ArraySort($array, 1, 0, 0, 1) ;_ArrayDisplay($array) Msgbox(0,"newest folder", $array[0][0]) ? Edited July 17, 2014 by mikell Link to comment Share on other sites More sharing options...
Solution jguinch Posted July 17, 2014 Solution Share Posted July 17, 2014 (edited) or just copy it in all OraInstall* directories#Include <File.au3> $aOraDir = _FileListToArray ( @TempDir, "OraInstall*", 2) If @error Then Exit MsgBox(16, "Error", "Unable to find the installation directory") For $i = 1 To $aOraDir[0] FileCopy("C:\Windows\System32\psapi.dll", @Tempdir & "\" & $aOraDir[$i], 1) FileSetAttrib( @Tempdir & "\" & $aOraDir[$i] & "\psapi.dll", "+R") Next Edited July 17, 2014 by jguinch Spoiler Network configuration UDF, _DirGetSizeByExtension, _UninstallList Firefox ConfigurationArray multi-dimensions, Printer Management UDF Link to comment Share on other sites More sharing options...
mikell Posted July 17, 2014 Share Posted July 17, 2014 jguinch's Colombus egg Link to comment Share on other sites More sharing options...
jguinch Posted July 17, 2014 Share Posted July 17, 2014 Yep my friend We should use more often simplicity... Spoiler Network configuration UDF, _DirGetSizeByExtension, _UninstallList Firefox ConfigurationArray multi-dimensions, Printer Management UDF Link to comment Share on other sites More sharing options...
ViciousXUSMC Posted July 23, 2014 Author Share Posted July 23, 2014 Ok thanks guys, will give it a shot. I tried to use "*" to move to all directories but I was probably using it with a function that does not support it like FileCopy using the array to emulate the process makes sense and would most likely be the solution I use since its simple and its not going to be more than a few folders with small file transfers. Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now