-
Notifications
You must be signed in to change notification settings - Fork 0
/
Get-LongFilenames.ps1
97 lines (64 loc) · 2.94 KB
/
Get-LongFilenames.ps1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
# Where to search for long file names.
$SearchPath = 'E:\'
# Max lenght of path. Add items longer than or equal to this number to the output report.
$MaxPathLen = 250
# How many files to check before updating the status.
# Don't set too low (below 100 or so) or it'll impact performance.
$FileQtyBeforeUpdateStatus = 100
# Where to save the output files.
$LogPath = 'C:\Temp'
# Do not edit below this line #
function Start-Logging {
Write-Output "$(Get-Date -Format O) : Start transcript."
if (Test-Path $LogPath) {
# Path exists, continuing.
Start-Transcript -Path $ScriptLogPath -NoClobber -ErrorAction Stop
} else {
# Path doesn't exist, try to create it.
New-Item -Type Directory -Path $LogPath -Force -ErrorAction Stop
Start-Transcript -Path $ScriptLogPath -NoClobber -ErrorAction Stop
}
}
function Stop-Logging {
Write-Output "$(Get-Date -Format O) : Stop transcript."
Stop-Transcript
}
# Get current date & time and setup log file.
$LogTime = $(Get-Date -f yyyyMMdd-HHmmss)
$ScriptLogPath = Join-Path -Path $LogPath -ChildPath "$LogTime-LongFilesTranscript.txt" -ErrorAction Stop
Start-Logging
Write-Output "$(Get-Date -Format O) : Getting files from $SearchPath. This may take a while."
# Get all the files in the search path.
$AllItems = Get-ChildItem -Path "$SearchPath" -Recurse -Force -ErrorAction SilentlyContinue
# Get qty of items to check.
$AllItemsQty = $AllItems.Count
Write-Output "$(Get-Date -Format O) : Found $AllItemsQty items."
# Counters for status updates
$CurrentCheck = 0
$FoundLongPaths = 0
# Where to hold the flagged long paths
[System.Collections.ArrayList]$LongFiles = @{}
# Loop through all the items in the search path to look for long paths.
foreach ($Item in $AllItems) {
# Check if status should be updated.
if ($CurrentCheck % $FileQtyBeforeUpdateStatus -eq 0) {
$PercentComplete = $($CurrentCheck / $AllItemsQty) * 100
Write-Progress -Activity 'Finding long file paths.' -Status "Test: $CurrentCheck / $AllItemsQty. Found: $FoundLongPaths" -PercentComplete $PercentComplete
}
# Get the length of the item
$ItemLen = $($Item.FullName.Trim()).length
# If length of the item is longer than the desired length, add it to the output list.
if ($ItemLen -ge $MaxPathLen) {
$FoundLongPaths ++
$LongFiles.Add($Item) | Out-Null
}
$CurrentCheck ++
}
# Setup output file.
Write-Output "$(Get-Date -Format O) : Found $FoundLongPaths long path names."
$OutputFilePath = Join-Path -Path $LogPath -ChildPath "$LogTime-LongFiles.txt" -ErrorAction Stop
# Output found long paths to a file.
Write-Output "$(Get-Date -Format O) : Long file paths exported to $OutputFilePath"
$LongFiles | Out-File -FilePath $OutputFilePath -NoClobber
Stop-Logging
Start-Process -FilePath "$env:SystemRoot\Explorer.exe" -ArgumentList $LogPath