Jump to content

Recommended Posts

Hey guys!

I tried looking for something like this in the web but could only find broken/impractical scripts or bogus download pages, so I made it and decided to share for future generations. The way it works is it takes all the files in the folder you run the script on, and given a choice it either turns the filename into "randomxx - filename.ext", "randomxx.ext" or you could use it to remove the "randomxx - " tag to undo what you did.

Well at least I hope that's the way it works, so be careful and use at your own discretion!

#include <File.au3>
#include <Array.au3>
Global $temp[UBound($farray)],$error=1,$count=0,$random[UBound($farray)+1],$ok=0
    $flag=InputBox("Filename Randomizer","Hello, this script works in the folder you run it on, so be careful!"&@CRLF&@CRLF&"1 to randomize keeping name"&@CRLF&"2 to randomize ditching name"&@CRLF&"3 to remove randomized tag")
    If @error=1 Then Exit
    Switch $flag
        Case $flag = 1
            $ok =1
        Case $flag = 2
            $ok =1
        Case $flag = 3
            $ok =1
        Case Else
            $exit=MsgBox(5,"error","You must input a valid option")
            If $exit = 2 Then Exit
Until $ok =1
If $flag=1 Or $flag=2 Then
    ProgressOn("Filename Randomizer","Organizing files...","0%")
    For $i=1 To UBound($farray)-1
        If $farray[$i]=@ScriptName Then
            Local $crumps[UBound($farray)+1]
            If $farray[$i]=$i Then
            If $error=0 Then
                    While $error=0
                        For $index=1 to UBound($farray)-1
                            If $farray[$index] = $k Then
                                If $k = UBound($farray)-1 Then
                                    MsgBox(0,"FATAL ERROR","One of the files is in use or something weird happened, sorry but I'm too lazy to work around this one, be more careful next time!")
                        If $error=0 Then
                            If $j=0 Then
                Until $j=0
If $flag=3 Then ProgressOn("Filename Randomizer","Checking and renaming...","0%")
For $i=1 To UBound($farray)-1
    If $farray[$i]=@ScriptName Then
        If $flag = 1 Then
            FileMove(@ScriptDir&""&$farray[$i],@ScriptDir&""&"random"&$random[$i]&" - "&$temp[$i])
        ElseIf $flag = 2 Then
            If @error=1 Then
        ElseIf $flag = 3 Then
            $artempex=StringSplit($farray[$i]," - ",1)
            If Not @error=1 Then
                If Not $rerror=0 Then FileMove(@ScriptDir&""&$farray[$i],@ScriptDir&""&StringTrimLeft($farray[$i],3+StringLen($artempex[1])))
If $count=0 And $flag=3 Then
    MsgBox (0,"","No files had that")
    MsgBox (0,"","Done! Press F5 on your folder")

; #FUNCTION# ====================================================================================================================
; Version........: 1.1 - 2011/11/24
; Name...........: _RandomUnique
; Description ...: Returns an array of unique random numbers
; Syntax.........: _RandomUnique($iCount, $nMin, $nMax, [$iInt = 0, [$nSeed = Default]])
; Parameters ....: $iCount - The amount of numbers to generate Number between 1 and 10^6-1
;                $nMin - The smallest number to be generated. Number between -2^31 and 2^31-1
;                $nMax - The largest number to be generated. Number between -2^31 and 2^31-1
;                $iInt - [optional] If this is set to 1 then an integer result will be returned. Default is a floating point number.
;                $nSeed  - [optional] Seed value for random number generation. Number between -2^31 and 2^31-1
; Return values .: Success - Returns a 1-dimensional array containing only unique numbers
;                           $Array[0] = count of generated numbers
;                           $Array[1] = first number
;                           $Array[2] = second number, etc
;               Failure  - Returns 0 and sets @error:
;                            | 1 - $iCount is too small
;                            | 2 - $iCount is too large
;                            | 3 - $nMin and $nMax are equal
;                            | 4 - $nMin is larger than $nMax
;                            | 5 - $nMin or $nMax exceeds limit
;                            | 6 - $nSeed exceeds limit
; Author ........: money
; Modified.......:
; Remarks .......: If $iInt is 1 and $iCount exceeds total unique numbers than @extend is set to 1 and item count is adjusted to the
;                + maximum numbers that can be returned
; Related .......:
; Link ..........:
; Example .......: Yes
; ===============================================================================================================================
Func _RandomUnique($iCount, $nMin, $nMax, $iInt = 0, $nSeed = Default)
    ; error checking
        ; $iCount is too small
        Case ($iCount < 1)
            Return SetError(1, 0, 0)
        ; $iCount is too large
        Case ($iCount > 10^6-1)
            Return SetError(2, 0, 0)
        ; $nMin and $nMax cannot be equal
        Case ($nMin = $nMax)
            Return SetError(3, 0, 0)
        ; $nMin cannot be larger than $nMax
        Case ($nMin > $nMax)
            Return SetError(4, 0, 0)
        ; $nMin or $nMax exceeds limit
        Case ( ($nMin < -2^31) Or ($nMax > 2^31-1) )
            Return SetError(5, 0, 0)
    ; user specific seed
    If IsNumber($nSeed) Then
        ; $nSeed exceeds limit
        If (($nSeed < -2^31) Or ($nSeed > 2^31-1) ) Then Return SetError(6, 0, 0)
    ; $iCount is equal too or exceeds maximum possible unique values
    Local $iCountInval = 0
    If ($iInt) Then
        ; positive
        If ($nMin >= 0) Then
            If ($iCount > ($nMax-$nMin)+1) Then
                $iCountInval = 1
            ElseIf ($iCount = ($nMax-$nMin)+1) Then
                $iCountInval = 3
        ; negative to positive
            If ($iCount > ($nMax + Abs($nMin)+1)) Then
                $iCountInval = 2
            ElseIf ($iCount = ($nMax + Abs($nMin)+1)) Then
                $iCountInval = 3
    ; courtesy
    If ($iInt And $iCount = 1) Then
        Local $aArray[2] = [1, Random($nMin, $nMax, $iInt)]
    ; $iCount is too large so we will generate as much we can from $nMin to $nMax values
    ElseIf $iCountInval Then
        If $iCountInval = 1 Then
            $iCount = Int($nMax - $nMin)+1
        ElseIf $iCountInval = 2 Then
            $iCount = Int($nMax + Abs($nMin))+1
        ; $iCount is equal to total unique numbers
        If $iCountInval = 3 Then $iCountInval = 0
        Local $aTmp, $iA, $iNumber = $nMin, $aArray[$iCount + 1] = [$iCount]
        ; add our numbers sequentially (from $iMin to $iMax)
        For $i = 1 To $aArray[0]
            $aArray[$i] = $iNumber
            $iNumber += 1
        ; swap every x index value with a random index value
        For $i = 1 To $aArray[0]
            $iA = Random($i, $aArray[0], 1)
            If $i = $iA Then ContinueLoop
            If $iA = 0 Then $iA = $aArray[0]
            $aTmp = $aArray[$i]
            $aArray[$i] = $aArray[$iA]
            $aArray[$iA] = $aTmp
    ; everything else is ok, generate unique numbers
        Local $nRnd, $iStep = 0, $aArray[$iCount + 1] = [$iCount]
        While ($iStep <= $iCount-1)
            $nRnd = Random($nMin, $nMax, $iInt)
            ; check if the number already exist
            If IsDeclared($nRnd) <> -1 Then
                $iStep += 1
                $aArray[$iStep] = $nRnd
                ; store our numbers in a local variable
                Assign($nRnd, '', 1)
    Return SetError(0, Number($iCountInval > 0), $aArray)

Thanks to money for such an efficient snippet!

Edited by Cybergon

Share this post

Link to post
Share on other sites

I have examples with 0 posts and 0 stars, so what is the problem?

UDF List:

_AdapterConnections()_AlwaysRun()_AppMon()_AppMonEx()_ArrayFilter/_ArrayReduce_BinaryBin()_CheckMsgBox()_CmdLineRaw()_ContextMenu()_ConvertLHWebColor()/_ConvertSHWebColor()_DesktopDimensions()_DisplayPassword()_DotNet_Load()/_DotNet_Unload()_Fibonacci()_FileCompare()_FileCompareContents()_FileNameByHandle()_FilePrefix/SRE()_FindInFile()_GetBackgroundColor()/_SetBackgroundColor()_GetConrolID()_GetCtrlClass()_GetDirectoryFormat()_GetDriveMediaType()_GetFilename()/_GetFilenameExt()_GetHardwareID()_GetIP()_GetIP_Country()_GetOSLanguage()_GetSavedSource()_GetStringSize()_GetSystemPaths()_GetURLImage()_GIFImage()_GoogleWeather()_GUICtrlCreateGroup()_GUICtrlListBox_CreateArray()_GUICtrlListView_CreateArray()_GUICtrlListView_SaveCSV()_GUICtrlListView_SaveHTML()_GUICtrlListView_SaveTxt()_GUICtrlListView_SaveXML()_GUICtrlMenu_Recent()_GUICtrlMenu_SetItemImage()_GUICtrlTreeView_CreateArray()_GUIDisable()_GUIImageList_SetIconFromHandle()_GUIRegisterMsg()_GUISetIcon()_Icon_Clear()/_Icon_Set()_IdleTime()_InetGet()_InetGetGUI()_InetGetProgress()_IPDetails()_IsFileOlder()_IsGUID()_IsHex()_IsPalindrome()_IsRegKey()_IsStringRegExp()_IsSystemDrive()_IsUPX()_IsValidType()_IsWebColor()_Language()_Log()_MicrosoftInternetConnectivity()_MSDNDataType()_PathFull/GetRelative/Split()_PathSplitEx()_PrintFromArray()_ProgressSetMarquee()_ReDim()_RockPaperScissors()/_RockPaperScissorsLizardSpock()_ScrollingCredits_SelfDelete()_SelfRename()_SelfUpdate()_SendTo()_ShellAll()_ShellFile()_ShellFolder()_SingletonHWID()_SingletonPID()_Startup()_StringCompact()_StringIsValid()_StringRegExpMetaCharacters()_StringReplaceWholeWord()_StringStripChars()_Temperature()_TrialPeriod()_UKToUSDate()/_USToUKDate()_WinAPI_Create_CTL_CODE()_WinAPI_CreateGUID()_WMIDateStringToDate()/_DateToWMIDateString()Au3 script parsingAutoIt SearchAutoIt3 PortableAutoIt3WrapperToPragmaAutoItWinGetTitle()/AutoItWinSetTitle()CodingDirToHTML5FileInstallrFileReadLastChars()GeoIP databaseGUI - Only Close ButtonGUI ExamplesGUICtrlDeleteImage()GUICtrlGetBkColor()GUICtrlGetStyle()GUIEventsGUIGetBkColor()Int_Parse() & Int_TryParse()IsISBN()LockFile()Mapping CtrlIDsOOP in AutoItParseHeadersToSciTE()PasswordValidPasteBinPosts Per DayPreExpandProtect GlobalsQueue()Resource UpdateResourcesExSciTE JumpSettings INISHELLHOOKShunting-YardSignature CreatorStack()Stopwatch()StringAddLF()/StringStripLF()StringEOLToCRLF()VSCROLLWM_COPYDATAMore Examples...

Updated: 22/04/2018

Share this post

Link to post
Share on other sites

Generically speaking......

What I've done in the past for this type of situation was (and i don't have the code handy)

rename the file to date + time + extension

IF that exists, then date+time(including seconds) + 1

and so and so forth.

i think it was like 4 or 5 lines of code and I was able to rename over 40k files like that.

granted it's ugly because your filenames are all 111112222333.jpg but i have photos stored by year/month

and the beauty of it is, how many files are created at the exact same second? not to many. and if one ever gets out of place, you know right where it belongs..

I imagine it won't work for every situation. but if you're willing to randomize a file name for the sake of uniqueness, then perhaps the date/time approach will be helpful.

Edited by blitzkrg

Share this post

Link to post
Share on other sites

@guinness I bet if someone rated those it would be a solid 5 star considering you're good unlike me.

@blitzkrg I know, I started with something really simple but then I went 'oh what if I wanna do this or that, or do it this way, or if this happens, or put a progress bar because it looks like it froze etc' and so I ended up with the abomination you see here.

Share this post

Link to post
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • By Colduction
      Hi guys! i want to write speedy and very fast code to check if chosen filename exists then add "-1" at end of it and if chosen filename exists again, add "-2" instead of "-1" and check filename until be unique.
      For Example: I have to write "Filename.txt" in C:\ directory with FileOpen then check if "Filename.txt" exists in that directory then rename chosen filename to "Filename-2.txt" and if exists again in directory, rename chosen filename to "Filename-3.txt" and do this work until to find unique number to add end of filename.

      ====================== SOLUTION by @Subz ======================
    • By Tippex
      I have a problem with FileOpenDialog using long default filenames ... they always get truncated. 
      For example: 
      "A Long FileName.mpg" as a default would prompt as just "FileName.mpg" (but scrolling left will show it named correctly).
      Does anyone know of a fix for this please (I didn't spot it in a Forum search), or is it one for the bug tracker?
      #include <FileConstants.au3> #include <MsgBoxConstants.au3> Local Const $sMessage = "Hold down Ctrl or Shift to choose multiple files." Local $sFileOpenDialog = FileOpenDialog($sMessage, @WindowsDir & "\", "Images (*.jpg;*.bmp)|Videos (*.avi;*.mpg)", BitOR($FD_FILEMUSTEXIST, $FD_MULTISELECT), "A Long FileName.mpg") Thanks,
    • By tezhihi
      Hi All,
      I have many files inside folder with ID Number. The problem here is I want to get ID Number,  file name inside folder and Get Size of its. However when I use loop "For" the result appeared with duplicate data. Please check the example in attached file and help me make the code below better for this case.
      #include <File.au3> #include <Array.au3> Global $a, $b $a = _FileListToArrayEx(@ScriptDir, '*.visf') For $i = 1 to $a[0] $b = StringSplit($a[$i], "\") ;~ _ArrayDisplay($b) For $j = 1 to $b[0] ;~ ConsoleWrite($b[$b[0] - 1] & '_' & $b[$b[0]] & ' ' & FileGetSize($a[$i]) & @CRLF) FileWrite(@ScriptDir & '\result.txt', $b[$b[0] - 1] & '_' & $b[$b[0]] & ' ' & FileGetSize($a[$i]) & @CRLF) Next Next Func _FileListToArrayEx($s_path, $s_mask = "*.*", $i_flag = 0, $s_exclude = -1, $f_recurse = True, $f_full_path = True) If FileExists($s_path) = 0 Then Return SetError(1, 1, 0) ; Strip trailing backslash, and add one after to make sure there's only one $s_path = StringRegExpReplace($s_path, "[\\/]+\z", "") & "\" ; Set all defaults If $s_mask = -1 Or $s_mask = Default Then $s_mask = "*.*" If $i_flag = -1 Or $i_flag = Default Then $i_flag = 0 If $s_exclude = -1 Or $s_exclude = Default Then $s_exclude = "" ; Look for bad chars If StringRegExp($s_mask, "[/:><\|]") Or StringRegExp($s_exclude, "[/:><\|]") Then Return SetError(2, 2, 0) EndIf ; Strip leading spaces between semi colon delimiter $s_mask = StringRegExpReplace($s_mask, "\s*;\s*", ";") If $s_exclude Then $s_exclude = StringRegExpReplace($s_exclude, "\s*;\s*", ";") ; Confirm mask has something in it If StringStripWS($s_mask, 8) = "" Then Return SetError(2, 2, 0) If $i_flag < 0 Or $i_flag > 2 Then Return SetError(3, 3, 0) ; Validate and create path + mask params Local $a_split = StringSplit($s_mask, ";"), $s_hold_split = "" For $i = 1 To $a_split[0] If StringStripWS($a_split[$i], 8) = "" Then ContinueLoop If StringRegExp($a_split[$i], "^\..*?\..*?\z") Then $a_split[$i] &= "*" & $a_split[$i] EndIf $s_hold_split &= '"' & $s_path & $a_split[$i] & '" ' Next $s_hold_split = StringTrimRight($s_hold_split, 1) If $s_hold_split = "" Then $s_hold_split = '"' & $s_path & '*.*"' Local $i_pid, $s_stdout, $s_hold_out, $s_dir_file_only = "", $s_recurse = "/s " If $i_flag = 1 Then $s_dir_file_only = ":-d" If $i_flag = 2 Then $s_dir_file_only = ":D" If Not $f_recurse Then $s_recurse = "" $i_pid = Run(@ComSpec & " /c dir /b " & $s_recurse & "/a" & $s_dir_file_only & " " & $s_hold_split, "", @SW_HIDE, 4 + 2) While 1 $s_stdout = StdoutRead($i_pid) If @error Then ExitLoop $s_hold_out &= $s_stdout WEnd $s_hold_out = StringRegExpReplace($s_hold_out, "\v+\z", "") If Not $s_hold_out Then Return SetError(4, 4, 0) ; Parse data and find matches based on flags Local $a_fsplit = StringSplit(StringStripCR($s_hold_out), @LF), $s_hold_ret $s_hold_out = "" If $s_exclude Then $s_exclude = StringReplace(StringReplace($s_exclude, "*", ".*?"), ";", "|") For $i = 1 To $a_fsplit[0] If $s_exclude And StringRegExp(StringRegExpReplace( _ $a_fsplit[$i], "(.*?[\\/]+)*(.*?\z)", "\2"), "(?i)\Q" & $s_exclude & "\E") Then ContinueLoop If StringRegExp($a_fsplit[$i], "^\w:[\\/]+") = 0 Then $a_fsplit[$i] = $s_path & $a_fsplit[$i] If $f_full_path Then $s_hold_ret &= $a_fsplit[$i] & Chr(1) Else $s_hold_ret &= StringRegExpReplace($a_fsplit[$i], "((?:.*?[\\/]+)*)(.*?\z)", "$2") & Chr(1) EndIf Next $s_hold_ret = StringTrimRight($s_hold_ret, 1) If $s_hold_ret = "" Then Return SetError(5, 5, 0) Return StringSplit($s_hold_ret, Chr(1)) EndFunc  
    • By ur
      I have an ini file which has structure as below.

      And I want to use this value and change only the file name in below path of another ini file.
      Can you suggest any approach.

    • By 31290
      Hi everyone
      Hope you're doing great today.
      Well, I have a little question about extracting a certain string from a file name to make comparison after treatment.
      Let's get into the details:
      First of all, I gather and store a machine BIOS Version by running this:
      RunWait(@ComSpec & " /c " & "wmic bios get SMBIOSBIOSVERSION >> C:\Drivers\Tag.txt" & @CRLF, "", @SW_HIDE, "$STDOUT_CHILD") _FileWriteToLine("c:\Drivers\BIOS_Version.txt", 1, "", 1) $sContent = FileRead ("C:\Drivers\BIOS_Version.txt") $sContent = StringRegExpReplace($sContent, " ", "") Result is, for example, A10
      Then, I download the latest available BIOS version from the Dell related model website and the filename of the latest BIOS is stored in a $sBIOSName variable.
      Result is for example, E5440A14.exe
      What i can't figure out is how to extract the Bios name stored in the $sBIOSName knowing that each model this app would run won't have the same number of chars.
      Indeed, I have some OPL790AXX.exe / OPL7010AXX.exe / E5470AXX.exe etc...
      I imagine something like getting the whole string, left trimming it to the first A found count 2 chars on the right and store them to have the possibility to make the check between A10 and A14 (as the number of char of filenames is never the same)
      Hope this is clear  If not, don't hesitate to ask for more.
      Thanks in advance for the help
  • Create New...