migrate to new repo
This commit is contained in:
parent
0971ff8f03
commit
2931268bb3
246
ArchivedCode/Find-DuplicatePaths.ps1
Normal file
246
ArchivedCode/Find-DuplicatePaths.ps1
Normal file
@ -0,0 +1,246 @@
|
|||||||
|
<#
|
||||||
|
for each server / Office
|
||||||
|
sanitize project number
|
||||||
|
Compare against each other office
|
||||||
|
if matched
|
||||||
|
get-file counts for each server
|
||||||
|
report duplicate site / count
|
||||||
|
#>
|
||||||
|
|
||||||
|
|
||||||
|
<#
|
||||||
|
Migrating to use a SQLLite DB.
|
||||||
|
|
||||||
|
#>
|
||||||
|
|
||||||
|
|
||||||
|
$PathToDB = "C:\Users\eeckert\Downloads\EgnyteTesting\Dedupe.SQLite"
|
||||||
|
$PathToOutput = "C:\Users\eeckert\Downloads\EgnyteTesting\Output"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
$CSV_ImportFolder = "M:\IT\Egnyte\DuplicateFiles\WorkingRun"
|
||||||
|
$CSV_List = Get-ChildItem -Path $CSV_ImportFolder -Filter '*.csv'
|
||||||
|
|
||||||
|
$Office_to_compare_data = $null
|
||||||
|
foreach ($CSV in $CSV_List) {
|
||||||
|
$csv_temp = Import-Csv $CSV.FullName
|
||||||
|
$Office_to_compare_data += $csv_temp
|
||||||
|
# all Offices loaded into data strcuture 1
|
||||||
|
}
|
||||||
|
|
||||||
|
$Office_to_compare_data = $Office_to_compare_data | sort Project, OfficeServer
|
||||||
|
|
||||||
|
$temp_CSV_List = Get-ChildItem -Path $CSV_ImportFolder -Exclude "Output" | sort name -Descending # get list of CSV's to compare to.
|
||||||
|
$temp_csv_data = $null
|
||||||
|
foreach ($temp_csv in $temp_CSV_List) {
|
||||||
|
|
||||||
|
$temp_csv_temp = Import-Csv -Path $temp_csv.FullName # load comparison data
|
||||||
|
$temp_csv_data += $temp_csv_temp | sort Project, OfficeServer
|
||||||
|
# all offices loaded into comparison data structure
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
$ServerProgress = @{
|
||||||
|
ID = 1
|
||||||
|
Activity = "Processing: " + $CSV.OfficeServer
|
||||||
|
# PercentComplete = 100
|
||||||
|
# CurrentOperation = $_.Project
|
||||||
|
}
|
||||||
|
Write-Progress @ServerProgress
|
||||||
|
|
||||||
|
$CurrentDate = Get-Date
|
||||||
|
if ($CurrentDate.DayOfWeek -in ("Monday", "Tuesday", "Wednesday", "Thursday", "Friday") -and $CurrentDate.Hour -GT 17 ) {
|
||||||
|
$ThreadLimit = 30
|
||||||
|
}
|
||||||
|
elseif ($CurrentDate.DayOfWeek -in ("Saturday", "Sunday")) {
|
||||||
|
$ThreadLimit = 30
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$ThreadLimit = 15
|
||||||
|
}
|
||||||
|
|
||||||
|
# foreach ($row in $Office_to_compare_data) {
|
||||||
|
# $Office_to_compare_data | Foreach-Object {
|
||||||
|
$Office_to_compare_data | Foreach-Object -ThrottleLimit $ThreadLimit -Parallel {
|
||||||
|
#Action that will run in Parallel. Reference the current object via $PSItem and bring in outside variables with $USING:varname
|
||||||
|
|
||||||
|
$PSStyle.Progress.View = "Minimal"
|
||||||
|
$DuplicateObj = $null
|
||||||
|
$NonDuplicateObj = $null
|
||||||
|
|
||||||
|
$JobID = Get-Random
|
||||||
|
|
||||||
|
$ComparisonProgress = @{
|
||||||
|
ID = $JobID
|
||||||
|
Activity = "Starting: " + $_.OfficeServer + ':' + $_.Project
|
||||||
|
PercentComplete = 0
|
||||||
|
# CurrentOperation = $_.Project
|
||||||
|
}
|
||||||
|
Write-Progress @ComparisonProgress
|
||||||
|
|
||||||
|
# if ($_.Project -in $USING:temp_csv_data.Project) {
|
||||||
|
if ($_.Project -in $USING:temp_csv_data.Project -and $USING:temp_csv_data.OfficeServer -ne $_.OfficeServer) {
|
||||||
|
$ignoreOffice = $_.OfficeServer
|
||||||
|
|
||||||
|
$duplicates = ''
|
||||||
|
$duplicates = $USING:temp_csv_data | where -property Project -eq $_.Project | where -Property OfficeServer -ne $_.OfficeServer
|
||||||
|
# $duplicates = $USING:temp_csv_data | where ((Project -eq $_.Project) -and (OfficeServer -ne $_.OfficeServer))
|
||||||
|
|
||||||
|
if (($_ -eq $duplicates) -or !($duplicates)) {
|
||||||
|
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
|
||||||
|
$ComparisonProgress = @{
|
||||||
|
ID = $JobID
|
||||||
|
Activity = "Get Original Data: " + $_.OfficeServer + ':' + $_.Project
|
||||||
|
PercentComplete = 15
|
||||||
|
CurrentOperation = "Getting Original data from " + $_.OfficeServer
|
||||||
|
}
|
||||||
|
Write-Progress @ComparisonProgress
|
||||||
|
|
||||||
|
Write-Debug ("Getting file counts from current office...this will take a second...") -Debug
|
||||||
|
# TODO - identify NON-Duplicated files in these file structures...
|
||||||
|
# $row_file_count = [System.IO.Directory]::GetFiles($_.FullPath, "*.*", "AllDirectories") | measure
|
||||||
|
$row_file = get-childitem -path $_.FullPath -recurse -depth 50 -File
|
||||||
|
$row_file_count = $row_file | measure
|
||||||
|
$row_file_lastwrite = $row_file | measure LastWriteTime -Maximum
|
||||||
|
$row_file_lastaccess = $row_file | measure LastAccessTime -Maximum
|
||||||
|
|
||||||
|
foreach ($duplicate in $duplicates) {
|
||||||
|
|
||||||
|
|
||||||
|
$ComparisonProgress = @{
|
||||||
|
ID = $JobID
|
||||||
|
Activity = "Get Duplicated data: " + $duplicate.OfficeServer + ':' + $_.Project
|
||||||
|
PercentComplete = 33
|
||||||
|
CurrentOperation = "Now getting duplicate path data from " + $duplicate.OfficeServer
|
||||||
|
}
|
||||||
|
Write-Progress @ComparisonProgress
|
||||||
|
|
||||||
|
|
||||||
|
$duplicate_file = get-childitem -path $duplicate.FullPath -recurse -depth 50 -File
|
||||||
|
$duplicate_file_count = $duplicate_file | measure
|
||||||
|
$duplicate_file_lastwrite = $duplicate_file | measure LastWriteTime -Maximum
|
||||||
|
$duplicate_file_lastaccess = $duplicate_file | measure LastAccessTime -Maximum
|
||||||
|
|
||||||
|
$ComparisonProgress = @{
|
||||||
|
ID = $JobID
|
||||||
|
Activity = "Processing: " + $duplicate.OfficeServer + ':' + $_.Project
|
||||||
|
PercentComplete = 66
|
||||||
|
# CurrentOperation = $_.Project
|
||||||
|
}
|
||||||
|
Write-Progress @ComparisonProgress
|
||||||
|
|
||||||
|
$result3 = [Regex]::Matches($_.FullPath, "^(.*[\\\/])") # This gets everything up the last slash, thus the "parent"
|
||||||
|
$ParentPath = $result3.value
|
||||||
|
|
||||||
|
$OriginalProject = "'" + [String]$_.Project
|
||||||
|
$DuplicateProject = "'" + [String]$duplicate.Project
|
||||||
|
|
||||||
|
if ($row_file_count.Count -ge 1 -and $duplicate_file_count.Count -ge 1) {
|
||||||
|
$DuplicateObj = [PSCustomObject]@{
|
||||||
|
OriginalServer = $_.OfficeServer
|
||||||
|
OriginalProject = "'" + $_.project
|
||||||
|
OriginalParent = $ParentPath
|
||||||
|
OriginalPath = $_.FullPath
|
||||||
|
OriginalFileCount = $row_file_count.Count ? $row_file_count.Count : 0
|
||||||
|
OriginalFileLastWrite = $row_file_Lastwrite.maximum
|
||||||
|
OriginalFileAccess = $row_file_lastaccess.maximum
|
||||||
|
DuplicateServer = $duplicate.OfficeServer
|
||||||
|
DuplicatePath = $duplicate.FullPath
|
||||||
|
DuplicateFileCount = $duplicate_file_count.Count ? $duplicate_file_count.count : 0
|
||||||
|
DuplicateFileLastWrite = $duplicate_file_Lastwrite.maximum
|
||||||
|
DuplicateFileAccess = $duplicate_file_lastaccess.maximum
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
elseif ($row_file_count.Count -eq 0 -and $duplicate_file_count.Count -gt 0) {
|
||||||
|
# Write-Host "File count is 0 on current side, remote server is source" -ForegroundColor DarkBlue
|
||||||
|
$NonDuplicateObj = [PSCustomObject]@{
|
||||||
|
OriginalServer = $duplicate.OfficeServer
|
||||||
|
OriginalProject = "'" + $duplicate.Project
|
||||||
|
OriginalPath = $duplicate.FullPath
|
||||||
|
OriginalFileCount = $duplicate_file_count.Count ? $duplicate_file_count.Count : 0
|
||||||
|
OriginalFileLastWrite = $duplicate_file_Lastwrite.maximum
|
||||||
|
OriginalFileAccess = $duplicate_file_lastaccess.maximum
|
||||||
|
}
|
||||||
|
}
|
||||||
|
elseif ($row_file_count.count -gt 0 -and $duplicate_file_count.Count -eq 0) {
|
||||||
|
# Write-Host "File count is 0 on one side, not a duplicate..." -ForegroundColor Blue
|
||||||
|
$NonDuplicateObj = [PSCustomObject]@{
|
||||||
|
OriginalServer = $_.OfficeServer
|
||||||
|
OriginalProject = "'" + $_.Project
|
||||||
|
OriginalPath = $_.FullPath
|
||||||
|
OriginalFileCount = $row_file_count.Count ? $row_file_count.Count : 0
|
||||||
|
OriginalFileLastWrite = $row_file_Lastwrite.maximum
|
||||||
|
OriginalFileAccess = $row_file_lastaccess.maximum
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
elseif ($_.Project -inotin $Office_to_compare_data.Project) {
|
||||||
|
$NonDuplicateObj = [PSCustomObject]@{
|
||||||
|
OriginalServer = $_.OfficeServer
|
||||||
|
OriginalProject = "'" + $_.Project
|
||||||
|
OriginalPath = $_.FullPath
|
||||||
|
OriginalFileCount = $row_file_count.Count ? $row_file_count.Count : 0
|
||||||
|
OriginalFileLastWrite = $row_file_Lastwrite.maximum
|
||||||
|
OriginalFileAccess = $row_file_lastaccess.maximum
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
$ComparisonProgress = @{
|
||||||
|
ID = $JobID
|
||||||
|
Activity = "Writing: " + $_.OfficeServer + ':' + $_.Project
|
||||||
|
PercentComplete = 100
|
||||||
|
# CurrentOperation = $_.Project
|
||||||
|
}
|
||||||
|
Write-Progress @ComparisonProgress -Completed
|
||||||
|
|
||||||
|
|
||||||
|
# Write-Host -ForegroundColor DarkGreen $_.OfficeServer "done, dumping output..."
|
||||||
|
}
|
||||||
|
do {
|
||||||
|
try {
|
||||||
|
|
||||||
|
# $DuplicateObj | Export-Csv -Path ($USING:CSV_ImportFolder + '\Output\' + $USING:CSV.Name + ' Duplicates.csv') -Append -ErrorVariable Dup_CSV_result -ErrorAction SilentlyContinue
|
||||||
|
$DuplicateObj | Export-Csv -Path ($USING:CSV_ImportFolder + '\Output\' + $_.OfficeServer + ' Duplicates.csv') -Append -ErrorVariable Dup_CSV_result -ErrorAction SilentlyContinue
|
||||||
|
}
|
||||||
|
catch {
|
||||||
|
<#Do this if a terminating exception happens#>
|
||||||
|
}
|
||||||
|
|
||||||
|
} while ($Dup_CSV_result.ErrorRecord -ne $null)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# do {
|
||||||
|
# try {
|
||||||
|
# $NonDuplicateObj | Export-Csv -Path ($USING:CSV_ImportFolder + '\Output\' + $USING:CSV.Name + 'NonDuplicates.csv') -Append -ErrorVariable Non_Dup_CSV_result -ErrorAction SilentlyContinue
|
||||||
|
|
||||||
|
# }
|
||||||
|
# catch {
|
||||||
|
# <#Do this if a terminating exception happens#>
|
||||||
|
# }
|
||||||
|
|
||||||
|
# } while ($Non_Dup_CSV_Result.ErrorRecord -ne $null)
|
||||||
|
$ComparisonProgress = @{
|
||||||
|
ID = $JobID
|
||||||
|
Activity = "Done: " + $_.OfficeServer + ':' + $_.Project
|
||||||
|
PercentComplete = 100
|
||||||
|
# CurrentOperation = $_.Project
|
||||||
|
}
|
||||||
|
Write-Progress @ComparisonProgress -Completed
|
||||||
|
}
|
||||||
|
|
||||||
|
# $OutPAth = $CSV_ImportFolder + '\Output\' + $CSV.Name + ' Duplicates.csv'
|
||||||
|
|
||||||
|
Write-Progress @ServerProgress -Completed
|
149
ArchivedCode/FindNonDupFiles.ps1
Normal file
149
ArchivedCode/FindNonDupFiles.ps1
Normal file
@ -0,0 +1,149 @@
|
|||||||
|
|
||||||
|
|
||||||
|
$CSV_ImportFile = 'M:\IT\Egnyte\DuplicateFiles\WorkingRun\Output'
|
||||||
|
$CSV_ClientList = "M:\IT\Egnyte\DuplicateFiles\Client List.csv"
|
||||||
|
|
||||||
|
$date = Get-Date -Format FileDate
|
||||||
|
$exportPath_main = "M:\IT\Egnyte\DuplicateFiles\$date NonDuplicates.csv"
|
||||||
|
|
||||||
|
$AllDuplicates_files = Get-ChildItem -Path $CSV_ImportFile -Filter "* Duplicates.csv" -File
|
||||||
|
$AllDuplicates = @()
|
||||||
|
foreach ($file in $AllDuplicates_files) {
|
||||||
|
$temp_val = Import-Csv $file.FullName
|
||||||
|
$AllDuplicates += $temp_val
|
||||||
|
}
|
||||||
|
|
||||||
|
$ClientList = Import-csv $CSV_ClientList
|
||||||
|
|
||||||
|
$BaseDrive = 'X:\'
|
||||||
|
$ProjectRegex = '^X:\\[A-Z]{2}\W\d{2}\\\d{2}'
|
||||||
|
$OfficeList = Get-ChildItem -Path $BaseDrive -Directory -Depth 0
|
||||||
|
|
||||||
|
$OfficeList | ForEach-Object -ThrottleLimit 3 -Parallel {
|
||||||
|
#Action that will run in Parallel. Reference the current object via $PSItem and bring in outside variables with $USING:varname
|
||||||
|
|
||||||
|
$XDrivePath = $_.FullName
|
||||||
|
Write-Host "Processing " $_.FullName -ForegroundColor Green
|
||||||
|
$ProjectFolders = get-childitem $_.FullName -Directory -Depth 2 | Where-Object FullName -Match $USING:ProjectRegex
|
||||||
|
|
||||||
|
$All_DupParent_Main = $USING:AllDuplicates.OriginalParent | sort -Unique
|
||||||
|
$All_DupProject_Main = $USING:AllDuplicates.OriginalProject | sort -Unique
|
||||||
|
$exportPath = $USING:exportPath_main
|
||||||
|
|
||||||
|
# $ProjectFolders now contains all folders down to the 3rd level of project number - for Example, 1234-567-001. We can now generate a project number for the output file.
|
||||||
|
# We need to get a file count for each "last" folder - IE, 001 in the example 1234-567-001.
|
||||||
|
|
||||||
|
$ProjectFolders | ForEach-Object -ThrottleLimit 15 -Parallel { #uncomment for threaded mode
|
||||||
|
# $ProjectFolders | ForEach-Object { #comment for threaded mode
|
||||||
|
Write-Host "Processing " $_.FullName -ForegroundColor Cyan
|
||||||
|
$projectNumber = ''
|
||||||
|
# thank you ChatGPT
|
||||||
|
$string = $_.FullName
|
||||||
|
$regex = "\\(\d+(-\d+)*)"
|
||||||
|
$matches = [regex]::Matches($string, $regex)
|
||||||
|
$result = ""
|
||||||
|
foreach ($match in $matches) {
|
||||||
|
$result += $match.Groups[1].Value
|
||||||
|
if ($match.Groups[2].Success) {
|
||||||
|
$result += $match.Groups[2].Value
|
||||||
|
}
|
||||||
|
# if ($match.Groups[3].Success) {
|
||||||
|
# $result += $match.Groups[3].Value
|
||||||
|
# }
|
||||||
|
}
|
||||||
|
|
||||||
|
$projectnumber = ("'" + $result)
|
||||||
|
$result3 = [Regex]::Matches($_.FullName, "^(.*[\\\/])") # This gets everything up the last slash, thus the "parent"
|
||||||
|
$ParentPath = $result3.value
|
||||||
|
|
||||||
|
# / Thank you Chat GPT
|
||||||
|
if ($projectnumber.Length -lt 6 ) {
|
||||||
|
# write-host $_.FullName " is not a project" -ForegroundColor Cyan
|
||||||
|
}
|
||||||
|
elseif ($projectnumber.Length -ge 6) {
|
||||||
|
$out = $null
|
||||||
|
$OfficeRegex = "(X:\\[A-Z]+)"
|
||||||
|
$str = $_.FullName -replace ($OfficeRegex, "")
|
||||||
|
$OfficeServer = $_.FullName.Substring(1, 4) -replace (':|\\', '')
|
||||||
|
|
||||||
|
$All_DupParent_copy = $USING:All_DupParent_main
|
||||||
|
|
||||||
|
|
||||||
|
if ($ParentPath -notin $All_DupParent_copy) {
|
||||||
|
$str = $ParentPath -replace ($OfficeRegex, "")
|
||||||
|
$EgnytePath1 = ("/Shared/N-Data" + $str) -replace ("\\", "/")
|
||||||
|
|
||||||
|
$fileList = Get-ChildItem $_.FullName -Recurse -Depth 1
|
||||||
|
$FileSize = $fileList | measure -Sum Length
|
||||||
|
$totalFiles = $fileList | measure
|
||||||
|
$LastWriteDate = $fileList | Measure-Object LastWriteTime -Maximum
|
||||||
|
$LastAccessDate = $fileList | Measure-Object LastAccessTime -Maximum
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
$out = [PSCustomObject]@{
|
||||||
|
OfficeServer = $OfficeServer
|
||||||
|
ProjectNumber = $projectNumber
|
||||||
|
ParentPath = $ParentPath
|
||||||
|
UNCPath = $ParentPath -replace ('X:', "\\mpe.ca\datadrive")
|
||||||
|
EgnytePath1 = $EgnytePath1
|
||||||
|
# EgnytePath2 = $EgnytePath2
|
||||||
|
FileCount = $totalFiles.Count
|
||||||
|
FolderSize = ($FileSize.Sum / 1024 / 1024 / 1024) # Get's size in GB
|
||||||
|
LastWrite = $LastWriteDate.Maximum
|
||||||
|
LastAccess = $LastAccessDate.Maximum
|
||||||
|
Parent = "Yes"
|
||||||
|
}
|
||||||
|
do {
|
||||||
|
try {
|
||||||
|
|
||||||
|
$out | Export-Csv -Path $exportPath -Append -ErrorVariable CSV_result -ErrorAction SilentlyContinue
|
||||||
|
}
|
||||||
|
catch {
|
||||||
|
<#Do this if a terminating exception happens#>
|
||||||
|
}
|
||||||
|
|
||||||
|
} while ($CSV_result.ErrorRecord -ne $null)
|
||||||
|
}
|
||||||
|
elseif ($projectNumber -notin $USING:All_DupProject_Main) {
|
||||||
|
$str = $_.FullName -replace ($OfficeRegex, "")
|
||||||
|
$EgnytePath1 = ("/Shared/N-Data" + $str) -replace ("\\", "/")
|
||||||
|
|
||||||
|
$fileList = Get-ChildItem $_.FullName -Recurse -Depth 50
|
||||||
|
$FileSize = $fileList | measure -Sum Length
|
||||||
|
$totalFiles = $fileList | measure
|
||||||
|
$LastWriteDate = $fileList | Measure-Object LastWriteTime -Maximum
|
||||||
|
$LastAccessDate = $fileList | Measure-Object LastAccessTime -Maximum
|
||||||
|
|
||||||
|
if (($FileSize.Sum -gt 0) -or ($totalFiles.Count -gt 0)) {
|
||||||
|
# no need to do anything if either value is Zero.
|
||||||
|
$out = [PSCustomObject]@{
|
||||||
|
OfficeServer = $OfficeServer
|
||||||
|
ProjectNumber = $projectNumber
|
||||||
|
ParentPath = $ParentPath
|
||||||
|
UNCPath = $_.FullName -replace ('X:', "\\mpe.ca\datadrive")
|
||||||
|
EgnytePath1 = $EgnytePath1
|
||||||
|
# EgnytePath2 = $EgnytePath2
|
||||||
|
FileCount = $totalFiles.Count
|
||||||
|
FolderSize = ($FileSize.Sum / 1024 / 1024 / 1024) # Get's size in GB
|
||||||
|
LastWrite = $LastWriteDate.Maximum
|
||||||
|
LastAccess = $LastAccessDate.Maximum
|
||||||
|
Parent = "No"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
do {
|
||||||
|
try {
|
||||||
|
|
||||||
|
$out | Export-Csv -Path $USING:exportPath -Append -ErrorVariable CSV_result -ErrorAction SilentlyContinue
|
||||||
|
# $out | Export-Csv -Path $exportPath -Append -ErrorVariable CSV_result -ErrorAction SilentlyContinue
|
||||||
|
}
|
||||||
|
catch {
|
||||||
|
<#Do this if a terminating exception happens#>
|
||||||
|
}
|
||||||
|
|
||||||
|
} while ($CSV_result.ErrorRecord -ne $null)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
38
ArchivedCode/ParentSquish.ps1
Normal file
38
ArchivedCode/ParentSquish.ps1
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
<#
|
||||||
|
Import all NonDuplicates.
|
||||||
|
Find "root" path for each client folder.
|
||||||
|
if a ROOT folder appears in the Duplicate list (MPE All.CSV), then we can't migrate.
|
||||||
|
If a root does not appear, we can output that to...something...and these can be added to the migration list without subfolders.
|
||||||
|
|
||||||
|
#>
|
||||||
|
|
||||||
|
|
||||||
|
$date = Get-Date -Format FileDate
|
||||||
|
$ImportPath = "M:\IT\Egnyte\DuplicateFiles\20230906 NonDuplicates.csv"
|
||||||
|
$DuplicateImportPath = "M:\IT\Egnyte\DuplicateFiles\MPE All.csv"
|
||||||
|
|
||||||
|
$Non_Duplicate_Folders = Import-Csv -Path $ImportPath
|
||||||
|
$Duplicate_Folders = Import-Csv -Path $DuplicateImportPath
|
||||||
|
|
||||||
|
$dupfolders = @()
|
||||||
|
foreach ($Dup_Folder in $Duplicate_Folders) {
|
||||||
|
$Duplicateresult = [Regex]::Matches($Dup_Folder.OriginalPath.Replace('X:\', '\\mpe.ca\datadrive\'), "^(.*[\\\/])")
|
||||||
|
$dupfolders += $Duplicateresult.Value
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
$dupfolders = $dupfolders | sort -Unique
|
||||||
|
$folder = [PSCustomObject]@()
|
||||||
|
$Non_Duplicate_Folders | foreach {
|
||||||
|
|
||||||
|
|
||||||
|
$result3 = [Regex]::Matches($_.UNCPath, "^(.*[\\\/])") # This gets everything up the last slash, thus the "parent"
|
||||||
|
$ParentPath = $result3.value
|
||||||
|
$out = @()
|
||||||
|
if ($ParentPath -notin $dupfolders) {
|
||||||
|
$out += [PSCustomObject]@{
|
||||||
|
ParentPath = $ParentPath
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$folder += $out
|
||||||
|
}
|
127
DataBaseLoad.ps1
Normal file
127
DataBaseLoad.ps1
Normal file
@ -0,0 +1,127 @@
|
|||||||
|
$PathToDB = "M:\IT\Egnyte\DuplicateFiles\WorkingRun\Dedupe.SQLite"
|
||||||
|
$PathToOutput = "M:\IT\Egnyte\DuplicateFiles\WorkingRun\Output"
|
||||||
|
$Refresh = $false
|
||||||
|
|
||||||
|
|
||||||
|
$DBExist = Test-Path $PathToDB
|
||||||
|
|
||||||
|
if (!($DBExist)) {
|
||||||
|
# Create SQLite DB
|
||||||
|
$Query = "Create Table FolderData (Server TEXT, Project TEXT, Parent TEXT, Path TEXT,FileCount INTEGER,FileSize REAL, FileLastWrite DATETIME, FileLastAccess DATETIME);PRAGMA journal_mode=WAL;"
|
||||||
|
$QResult = Invoke-SqliteQuery -Database $PathToDB -Query $Query
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
$CSV_ImportFolder = "C:\Users\eeckert\Downloads\EgnyteTesting"
|
||||||
|
$CSV_List = Get-ChildItem -Path $CSV_ImportFolder -Filter '*.csv'
|
||||||
|
|
||||||
|
$Office_to_compare_data = $null
|
||||||
|
foreach ($CSV in $CSV_List) {
|
||||||
|
$csv_temp = Import-Csv $CSV.FullName
|
||||||
|
$Office_to_compare_data += $csv_temp
|
||||||
|
# all Offices loaded into data strcuture 1
|
||||||
|
}
|
||||||
|
|
||||||
|
# Load Data into SQL DB
|
||||||
|
$Office_to_compare_data = $Office_to_compare_data | sort -Property Project, OfficeServer
|
||||||
|
$Office_to_compare_data | ForEach-Object -ThrottleLimit 15 -parallel { #-ThrottleLimit 5 -parallel
|
||||||
|
|
||||||
|
$ErrorLog = $USING:PathToOutput + '\SQL Error Log.txt'
|
||||||
|
$DBCopy = $USING:PathToDB #copy DB Path into local runspace
|
||||||
|
$Refresh_Copy = $USING:Refresh
|
||||||
|
# $ErrorLog = $PathToOutput + '\SQL Error Log.txt'
|
||||||
|
# $DBCopy = $PathToDB #copy DB Path into local runspace
|
||||||
|
# $Refresh_Copy = $Refresh
|
||||||
|
|
||||||
|
$JobID = Get-Random
|
||||||
|
$ProgressData = @{
|
||||||
|
ID = $JobID
|
||||||
|
Activity = "Analysing:" + $_.OfficeServer + ": " + $_.Project
|
||||||
|
PercentComplete = 10
|
||||||
|
|
||||||
|
}
|
||||||
|
Write-Progress @ProgressData
|
||||||
|
|
||||||
|
$OfficeServer = $_.OfficeServer
|
||||||
|
$Project = $_.Project
|
||||||
|
$FullPath = $_.FullPath
|
||||||
|
|
||||||
|
$DBConn = New-SQLiteConnection -Database $DBCopy
|
||||||
|
|
||||||
|
$Query = "SELECT Project FROM FolderData where Project = '$Project';"
|
||||||
|
$sql_result = Invoke-SqliteQuery -DataSource $DBCopy -Query $Query
|
||||||
|
|
||||||
|
if ($sql_result.Project -eq $null -or $Refresh_Copy -eq $true) {
|
||||||
|
# No need to re-do what we've done - move on to the next one
|
||||||
|
|
||||||
|
if ($DBConn.State -eq "Open") {
|
||||||
|
|
||||||
|
$result3 = [Regex]::Matches($_.FullPath, "^(.*[\\\/])") # This gets everything up the last slash, thus the "parent"
|
||||||
|
|
||||||
|
$ProgressData = @{
|
||||||
|
ID = $JobID
|
||||||
|
Activity = "Getting file data for:" + $_.OfficeServer + ": " + $_.Project
|
||||||
|
PercentComplete = 25
|
||||||
|
|
||||||
|
}
|
||||||
|
Write-Progress @ProgressData
|
||||||
|
|
||||||
|
$FolderPath_Data = Get-ChildItem -Path $_.FullPath -File -Depth 50 -Recurse
|
||||||
|
$folder_Parent = $result3.value
|
||||||
|
$folder_FileSize = ($FolderPath_Data | Measure -sum Length).sum / 1024 / 1024 / 1024
|
||||||
|
$folder_FileCount = ($FolderPath_Data | measure).Count
|
||||||
|
$folder_LastWrite = ($FolderPath_Data | measure LastWriteTime -Maximum).Maximum
|
||||||
|
$folder_LastAccess = ($FolderPath_Data | measure LastAccessTime -Maximum).Maximum
|
||||||
|
|
||||||
|
$ProgressData = @{
|
||||||
|
ID = $JobID
|
||||||
|
Activity = "Writing to DB:" + $_.OfficeServer + ": " + $_.Project
|
||||||
|
PercentComplete = 75
|
||||||
|
|
||||||
|
}
|
||||||
|
Write-Progress @ProgressData
|
||||||
|
|
||||||
|
|
||||||
|
## Build Query and hopefully write to DB
|
||||||
|
|
||||||
|
if ($folder_FileSize -le 0 -or $folder_FileCount -eq $null) {
|
||||||
|
#Let's ignore Null Values
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
|
||||||
|
try {
|
||||||
|
$Query = "Insert into FolderData (Server,Project,Parent,Path,FileCount,FileSize,FileLastWrite,FileLastAccess) VALUES ('$OfficeServer','$Project',`"$folder_Parent`",`"$FullPath`",$folder_FileCount,$folder_FileSize,'$folder_LastWrite','$Folder_LastAccess')"
|
||||||
|
Invoke-SqliteQuery -Database $DBCopy -Query $Query #-ErrorVariable SQLError
|
||||||
|
}
|
||||||
|
catch {
|
||||||
|
$timestamp = get-date
|
||||||
|
$errorMessage = $SQLError.ErrorRecord
|
||||||
|
|
||||||
|
$OutString = "[$timestamp] `t $errorMessage `t Query: `t $Query"
|
||||||
|
|
||||||
|
try {
|
||||||
|
$OutString | Add-Content -Path $ErrorLog
|
||||||
|
}
|
||||||
|
catch {
|
||||||
|
New-Item -Path $ErrorLog -Value $OutString
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
$DBConn.Close()
|
||||||
|
$ProgressData = @{
|
||||||
|
ID = $JobID
|
||||||
|
Activity = "Analysing:" + $_.OfficeServer + ": " + $_.Project
|
||||||
|
PercentComplete = 100
|
||||||
|
}
|
||||||
|
Write-Progress @ProgressData -Completed
|
||||||
|
|
||||||
|
}
|
||||||
|
|
128
Get-ProjectFolders.ps1
Normal file
128
Get-ProjectFolders.ps1
Normal file
@ -0,0 +1,128 @@
|
|||||||
|
<#
|
||||||
|
Script should:
|
||||||
|
1) get list of all Project Folders
|
||||||
|
2) Determine if there's content in these folders (exlude shortcuts, lnks, single files)
|
||||||
|
3) Flag folders with content
|
||||||
|
4) Output results to file for each server.
|
||||||
|
|
||||||
|
Each Output file should be read by the analysis script to determine locations with duplicate data.
|
||||||
|
|
||||||
|
Output File should show:
|
||||||
|
X:\CG | ProjectNumber | FullPath | filecount
|
||||||
|
|
||||||
|
#>
|
||||||
|
$PathToDB = "M:\IT\Egnyte\DuplicateFiles\WorkingRun\Dedupe.SQLite"
|
||||||
|
$BaseDrive = 'X:\'
|
||||||
|
$ProjectRegex = '^X:\\[A-Z]{2}\W\d{2}\\\d{2}'
|
||||||
|
$OfficeList = Get-ChildItem -Path $BaseDrive -Directory -Depth 0
|
||||||
|
|
||||||
|
$OfficeList | ForEach-Object -parallel {
|
||||||
|
$PathToDB_Copy_Main = $USING:PathToDB
|
||||||
|
$ServerProgress = @{
|
||||||
|
ID = 1
|
||||||
|
Activity = "Processing: " + $_.FullName
|
||||||
|
# PercentComplete = 100
|
||||||
|
# CurrentOperation = $_.Project
|
||||||
|
}
|
||||||
|
Write-Progress @ServerProgress
|
||||||
|
#Action that will run in Parallel. Reference the current object via $PSItem and bring in outside variables with $USING:varname
|
||||||
|
|
||||||
|
$XDrivePath = $_.FullName
|
||||||
|
# Write-Host "Processing " $_.FullName -ForegroundColor Green
|
||||||
|
$ProjectFolders = get-childitem $_.FullName -Directory -Depth 2 | Where-Object FullName -Match $USING:ProjectRegex
|
||||||
|
|
||||||
|
# $ProjectFolders now contains all folders down to the 3rd level of project number - for Example, 1234-567-001. We can now generate a project number for the output file.
|
||||||
|
# We need to get a file count for each "last" folder - IE, 001 in the example 1234-567-001.
|
||||||
|
|
||||||
|
$ProjectFolders | ForEach-Object -ThrottleLimit 15 -Parallel {
|
||||||
|
# Write-Host "Processing " $_.FullName -ForegroundColor Cyan
|
||||||
|
$PathToDB_Copy = $USING:PathToDB_Copy_Main
|
||||||
|
|
||||||
|
$JobID = Get-Random
|
||||||
|
$CurentLoopProgress = @{
|
||||||
|
ID = $JobID
|
||||||
|
Activity = "Analyzing " + $_.FullName
|
||||||
|
PercentComplete = 10
|
||||||
|
}
|
||||||
|
|
||||||
|
Write-Progress @CurentLoopProgress
|
||||||
|
|
||||||
|
$projectNumber = ''
|
||||||
|
# thank you ChatGPT
|
||||||
|
$string = $_.FullName
|
||||||
|
$regex = "\\(\d+(-\d+)*)"
|
||||||
|
$matches = [regex]::Matches($string, $regex)
|
||||||
|
$result = ""
|
||||||
|
foreach ($match in $matches) {
|
||||||
|
$result += $match.Groups[1].Value
|
||||||
|
if ($match.Groups[2].Success) {
|
||||||
|
$result += $match.Groups[2].Value
|
||||||
|
}
|
||||||
|
# if ($match.Groups[3].Success) {
|
||||||
|
# $result += $match.Groups[3].Value
|
||||||
|
# }
|
||||||
|
}
|
||||||
|
# / Thank you Chat GPT
|
||||||
|
# $result = $result -replace ('-','')
|
||||||
|
|
||||||
|
|
||||||
|
if ($result.Length -lt 5 ) {
|
||||||
|
# $CurentLoopProgress = @{
|
||||||
|
# ID = $JobID
|
||||||
|
# Activity = $_.FullName + " Not a Project"
|
||||||
|
# }
|
||||||
|
|
||||||
|
# Write-Progress @CurentLoopProgress
|
||||||
|
}
|
||||||
|
elseif ($result.Length -ge 5) {
|
||||||
|
|
||||||
|
$projectnumber = $result
|
||||||
|
$DBConnect = New-SqliteConnection -DataSource $PathToDB_Copy
|
||||||
|
$Query = "Select Project FROM FolderData where Project = '$ProjectNumber'"
|
||||||
|
$sql_result = Invoke-SqliteQuery -DataSource $PathToDB_Copy -Query $Query
|
||||||
|
|
||||||
|
if ($sql_result.project -eq $null) {
|
||||||
|
$CurentLoopProgress = @{
|
||||||
|
ID = $JobID
|
||||||
|
Activity = "Loading Telemetry for " + $_.FullName
|
||||||
|
PercentComplete = 75
|
||||||
|
}
|
||||||
|
|
||||||
|
Write-Progress @CurentLoopProgress
|
||||||
|
|
||||||
|
|
||||||
|
$result3 = [Regex]::Matches($_.FullName, "^(.*[\\\/])") # This gets everything up the last slash, thus the "parent"
|
||||||
|
$FolderPath_Data = Get-ChildItem -Path $_.FullName -File -Depth 50 -Recurse
|
||||||
|
$folder_Parent = $result3.value
|
||||||
|
$folder_FileSize = ($FolderPath_Data | Measure -sum Length).sum / 1024 / 1024 / 1024
|
||||||
|
$folder_FileCount = ($FolderPath_Data | measure).Count
|
||||||
|
$folder_LastWrite = ($FolderPath_Data | measure LastWriteTime -Maximum).Maximum
|
||||||
|
$folder_LastAccess = ($FolderPath_Data | measure LastAccessTime -Maximum).Maximum
|
||||||
|
|
||||||
|
if ($folder_FileSize -le 0 -or $folder_FileCount -eq $null) {
|
||||||
|
|
||||||
|
#Let's ignore Null Values
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
|
||||||
|
$out = [PSCustomObject]@{
|
||||||
|
Server = $_.FullName.Substring(1, 4) -replace (':|\\', '')
|
||||||
|
Project = $ProjectNumber
|
||||||
|
Parent = $folder_Parent
|
||||||
|
Path = $_.FullName
|
||||||
|
FileCount = $folder_FileCount
|
||||||
|
FileSize = $folder_FileSize
|
||||||
|
FileLastWrite = $folder_LastWrite
|
||||||
|
FileLastAccess = $folder_LastAccess
|
||||||
|
} | Out-DataTable
|
||||||
|
|
||||||
|
Invoke-SQLiteBulkCopy -DataSource $PathToDB_Copy -Table "FolderData" -DataTable $out -Force
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$DBConnect.Close()
|
||||||
|
}
|
||||||
|
Write-Progress @CurentLoopProgress -Completed
|
||||||
|
}
|
||||||
|
Write-Progress @ServerProgress -Completed
|
||||||
|
} -ThrottleLimit 5
|
Loading…
Reference in New Issue
Block a user