Random folders structure with random files using Powershell
Below is the script which will create you a directory structure 4 levels deep. For docx files, it will insert randomly some images.
You can set
- the numbers of words in a file
- the random number of files in a directory
- the root-folder name
- the folder where images needed for docx files are located ( you will be asked for that folder )
#########################################################################
########## Creating directories structure and populate it with random files ##########
#########################################################################
########## Definign variables ##########
$location = "c:\powershellscripts1"
if (!(test-path ($location)))
{
New-Item -ItemType Directory $location
}
Set-Location $location
cls
Read-Host "The structure will be created in $location`nPlease press any key to continue"
# How many sub-directory in each directory
$nr_folders = 5
# Directory's name pattern
$nume="\folder_"
# Where to create the structure
$main_folder = (Get-Location).path+$nume+"root"
# How many wors, random, in each file
$Words_max_no = 500
$Words_min_no = 15
# Defining the words dictionary, which will be used creating txt and docx files
$words_array = $null
$words_array = @()
$words = "time,person,year,way,day,thing,man,world,life,hand,part,child,eye,woman,place,work,week,case,point,government,company,number,group,problem,fact,be,have,do,say,get,make,go,know,take,see,come,think,look,want,give,use,find,tell,ask,work,seem,feel,try,leave,call,good,new,first,last,long,great,little,own,other,old,right,big,high,different,small,large,next,early,young,important,few,public,bad,same,able,up,so,out,just,now,how,then,more,also,here,well,only,very,even,back,there,down,still,in,as,too,when,never,really,most,of,in,to,for,with,on,at,from,by,about,as,into,like,through,after,over,between,out,against,during,without,before,under,around,among,it,I,you,he,they,we,she,who,them,me,him,one,her,us,something,nothing,anything,himself,everything,someone,themselves,everyone,itself,anyone,myself,and,that,but,or,as,if,when,than,because,while,where,after,so,though,since,until,whether,before,although,nor,like,once,unless,now,except"
foreach ($item in $words.Split(","))
{
$words_array += $item
}
# File types will be created
$types = "txt,docx,xlsx"
# How many file will be created in each directory
$files_number_max = 4
$files_number_min = 1
# Get the pictures which will be included in docx files
$pics = @{}
$pics = Get-ChildItem ((new-object -com Shell.Application).BrowseForFolder(0, "Select the source folder", 0, "")).Self.Path -Filter *.jpg
######################################
function createfile($Folder,$pics,$words_array,$extension,$Words_max_no,$Words_min_no)
{
$new_line = 0
$line = ""
$delimiter = " "
# Total number of word in file
$words_number = Get-Random -Maximum $Words_max_no -Minimum $Words_min_no
# At which chars, introduce a special char
$nr = [math]::Round((get-random -maximum 50 -minimum 24)/4)
# Words per row
$wordsinline = 3*(get-random -Maximum 10 -Minimum 3)
$lines=0
if($extension -match 'docx')
{
$word=new-object -ComObject "Word.Application"
$doc=$word.documents.Add()
#$word.Visible=$True
$selection=$word.Selection
}
$Name = ((65..90) | Get-Random | % {[char]$_})+((65..90) | Get-Random | % {[char]$_})+((65..90) | Get-Random | % {[char]$_})+((65..90) | Get-Random | % {[char]$_})+((65..90) | Get-Random | % {[char]$_})+((65..90) | Get-Random | % {[char]$_})+"_$($words_number)_$dat.$extension"
$FILENAME = $FOLDER+'\'+$name
for ($i = 1; $i -lt $words_number; $i++)
{
$new_line = $new_line + 1
if ( $new_line -eq $wordsinline)
{
##### check if introduce new line in txt file
$lines = $lines + 1
if($extension -match 'docx')
{
if ($lines -eq (Get-Random -Maximum 20 -Minimum 5))
{
# Insert image
$lines = 0
$selectimage = $selection.InlineShapes.AddPicture($pics[(Get-Random -Maximum ($pics.Length) -Minimum 0)].FullName)
}
}
$line += " " + $words_array[(Get-Random -Maximum $words_array.Length)]
$line = $line.Trim(" ").substring(0,1).toupper() + $line.Trim(" ").substring(1) + "."
if($extension -match 'txt')
{
$line | Out-File $FILENAME -Append
}
if($extension -match 'docx')
{
$selection.TypeText($line)
$selection.TypeText("`n")
}
$wordinline = 3*(get-random -Maximum 10 -Minimum 3)
$new_line = 0
$line = ""
$wordsinline = 3*(get-random -Maximum 10 -Minimum 3)
}
else
{
$new_word = $words_array[(Get-Random -Maximum $words_array.Length)]
if((($i/$nr - [math]::round($i/$nr)) -eq 0) -and ($new_line -gt 1 ))
{
$delimiter = (Get-Random -InputObject "!", "?", ".", "-",";","_")+" "
$new_word = $new_word.Trim(" ").substring(0,1).toupper()+$new_word.Trim(" ").substring(1)
}
else
{
$delimiter = " "
}
$line += $delimiter + $new_word
}
}
if($extension -match 'docx')
{
$doc.SaveAs([ref]$FILENAME)
$doc.Close()
$word.quit()
}
if($extension -match 'xlsx')
{
excel_file $FILENAME
}
"...the document $filename was created. Enjoy! "
}
function excel_file ($FILENAME)
{
# Defining chart type numbers
$charttype= @(3,4,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,81,82,83)
$excel = New-Object -ComObject excel.application
#$excel.Visible = $True
$excel.DisplayAlerts = $False
$workbook = $excel.Workbooks.Add()
$serverInfoSheet = $workbook.Worksheets.Item(1)
$serverInfoSheet.Activate() | Out-Null
$serverInfoSheet.Cells.Item(1,1)= 'Excel File Test'
$columns = Get-Random -Minimum 3 -Maximum 7
$rows = Get-Random -Minimum 20 -Maximum 40
for ($col = 1; $col -le $columns; $col++)
{
$serverInfoSheet.Cells.Item(2,2 + $col)='Budget ' + $col.ToString()
$serverInfoSheet.Cells.Item(2,2 + $col).Font.Bold = $true
}
for ($row = 1; $row -le $rows; $row++)
{
$serverInfoSheet.Cells.Item(2 + $row,2)=2000 + $row.ToString()
$serverInfoSheet.Cells.Item(2 + $row,2).font.bold = $True
}
for ($col = 1; $col -le $columns; $col++)
{
for ($row = 1; $row -le $rows; $row++)
{
$serverInfoSheet.Cells.Item($row+2,$col+2) = Get-Random -Minimum 100 -Maximum 2593
}
}
$temp = $excel.Charts.Add()
$temp.Delete()
$chart = $serverInfoSheet.Shapes.AddChart().Chart
$serverInfoSheet.Activate()
$chart.ChartType = $charttype[(get-random -maximum $charttype.Count)]
$min = 'b2'
$max = [char](66+$columns)+($rows+2).ToString()
$chartdata = $serverInfoSheet.Range($min,$max)
$chart.SetSourceData($chartdata)
$serverInfoSheet.SaveAs($FILENAME)
$excel.displayAlerts=$False
$excel.Quit()
}
function main($folder,$words_array,$types,$files_number_max,$files_number_min,$pics,$Words_max_no,$Words_min_no ){
$folder
foreach ($extension in $types.Split(","))
{
$extension
#calculating a random number for files number with specific error
[int]$files_nr = Get-Random -maximum $files_number_max -Minimum $files_number_min
Write-Host "I will create in this folder $files_nr $extension files"
for ($k = 1; $k -le $files_nr; $k++)
{
. createfile $folder $pics $words_array $extension $Words_max_no $Words_min_no
"... working hard ..."
}
}
}
cls
# Creates the directories structure
for ($i1 = 1; $i1 -le $nr_folders; $i1++)
{
$nume_final= $main_folder + $nume+$i1.ToString()
New-Item -ItemType Directory $nume_final -ErrorAction SilentlyContinue
$nr2 = Get-Random -Maximum $nr_folders -Minimum 0
$folder = $nume_final
main $folder $words_array $types $files_number_max $files_number_min $pics $Words_max_no $Words_min_no | Out-Null
for ($i2 = 1; $i2 -le $nr2; $i2++)
{
$nume_final2= $nume_final+$nume+$i2.ToString()+$i1.ToString()
New-Item -ItemType Directory $nume_final2 -ErrorAction SilentlyContinue
$nr3 = Get-Random -Maximum $nr_folders -Minimum 0
$folder = $nume_final2
main $folder $words_array $types $files_number_max $files_number_interval_min $pics $Words_max_no $Words_min_no | Out-Null
for ($i3 = 1; $i3 -le $nr3; $i3++)
{
$nume_final3= $nume_final2+$nume+$i3.ToString()+$i2.ToString()+$i1.ToString()
New-Item -ItemType Directory $nume_final3 -ErrorAction SilentlyContinue
$nr4 = Get-Random -Maximum $nr_folders -Minimum 0
$folder = $nume_final3
main $folder $words_array $types $files_number_max $files_number_min $pics $Words_max_no $Words_min_no | Out-Null
for ($i4 = 1; $i4 -le $nr4; $i4++)
{
$nume_final4= $nume_final3+$nume+$i4.ToString()+$i3.ToString()+$i2.ToString()+$i1.ToString()
New-Item -ItemType Directory $nume_final4 -ErrorAction SilentlyContinue
$folder = $nume_final4
main $folder $words_array $types $files_number_max $files_number_min $pics $Words_max_no $Words_min_no | Out-Null
}
}
}
}