I am new here and I facing issues with my powershell script whith long paths.
This script aims to get relative path and hash from files/folders and its subfolders. It works with some with others I get the following error:
Get-ChildItem : The specified path, file name, or both are too long. The fully qualified file name must be less than 260 characters, and the directory name must be less than 248 characters.
I would like to know how to handle this and avoiding to give me this error please.
I have enabled the long file paths in Windows server 2012 where I am running the script and it still does not work.
If I add this \\?\ in the path variable, it failes saying that there are Illegal characters in path even if I add -LiteralPath.
Any help would be great
This is mypowershell script:
#Message to user
Write-Output "`nThis script will collect the FilePathName, Name, RelativePath and the Hash of the files/folders you have chosen."
"`nAt the end, it will tell you how long it took to run the script"
Read-Host -Prompt "`nPress ENTER to continue or CTRL+C to quit"
#Counting the time from the beginning
$starttime = (Get-Date)
#Variables
#Can only be added 3 paths maximum. If added more than 3 it may change the relatrive path
$root = "C:\mypath"
#Variable for creating the CSV File
$report = "mycsvfile.csv"
#Process for generating the HASH
$hasher = [System.Security.Cryptography.SHA256]::Create()
$AllFiles = @()
"`n"#line space
Write-Host "Generating the Hash from $root"
#Getting information from directories
foreach ($file in get-childitem $root -recurse | Select-Object FullName, Directory, Name, PSIsContainer, Length)
{
$acl = get-acl $file.fullname | select-object owner,accesstostring,group
$obj = new-object psObject
#Generating HASH File
if(!$file.PsIsContainer)
{
$relativePath = $file.FullName.Substring($root.Length)
Write-Host "Debug $relativePath" -ForegroundColor Green
$inputStream = New-Object IO.StreamReader $file.fullname
$hashBytes = $hasher.ComputeHash($inputStream.BaseStream)
$inputStream.Close()
$builder = New-Object System.Text.StringBuilder
$hashBytes | Foreach-Object { [void] $builder.Append($_.ToString("X2")) }
#Add info into CSV FILE
$obj | Add-Member -membertype noteproperty -name FilePathandName -Value $file.FullName
$obj | Add-Member -membertype noteproperty -name Name -Value $file.Name
$obj | Add-Member -MemberType noteproperty -Name RelativePath -Value $relativePath #-force
$obj | Add-Member -MemberType noteproperty -Name Hash -Value $builder.ToString()
#$obj | Add-Member -membertype noteproperty -name CreationTime -Value $file.CreationTime
#$obj | Add-Member -MemberType noteproperty -Name LastAccessTime -Value $file.LastAccessTime
#$obj | Add-Member -MemberType noteproperty -Name LastWriteTime -Value $file.LastWriteTime
#Variable to send info to CSV
$AllFiles += $obj
Clear-Variable relativePath
}
Remove-Variable obj
}
#$AllFiles += $obj
#Generating CSV FILE
$AllFiles |Export-Csv $report –NoTypeInformation
"`n"
Write-Host "$report File has been created "
"`n"
Write-Host "The script took:`n"
$endTime = Get-Date
New-TimeSpan -Start $startTime -End $endTime