Differences in $Null, '' and ""

Today I had built a script in order to do a clean up of users when they quit or get termed. But I was having an issue with the $Null variable and different issues when using comparison operators like -eq, -ne and -like. I would pull data and the do some testing with if statements but would not get what I was expecting in return. I am a tad new to PowerShell, but you can blame Jeffrey Snover as I read one of his blogs and he said to not worry about being an embarrassed beginner. You can see his post Variable Scopes and $PRIVATE: | Jeffrey Snover's blog

Any pointers in what I am doing wrong would be much appreciated.

Here are the parts I was having issues with:
In this If statement I started with everything equaling $Null, but for some reason it was not respecting the $strRDFExists and $strRPExists. I had to change them to single quotes.

If(($ForwardRefreshed.ForwardingAddress) -eq $Null -and ($UserRefreshed.Manager) -eq $Null -and ($UserRefreshed.ProfilePath) -eq $Null -and ($strRDFExists) -eq '' -and ($strRPExists) -eq '')
{
     Write-Verbose "$($User.Name) - Is moved to Terminated - Archived"
     Get-ADUser $($User.SamAccountName) | Move-ADObject -TargetPath "OU=Terminated - Archive - No DirSync,DC=Company,DC=com"
     $strMoveSetting = 1
}

I also had issues with the same If statements in order to build my output:
I had first set the If statements to just check if they had content by not using comparison operators like -ne or -like. I started having issues so I had to use some $Null and -like operators.

If($UserRefreshed.ProfilePath -ne $Null)
 {
    $objOutput | Add-Member -Type NoteProperty -Name "ProfilePath" -Value $($UserRefreshed.ProfilePath)
 }
If($strRPExists -like "\\*")
{
     $objOutput | Add-Member -Type NoteProperty -Name "ProfileExist" -Value $($strRPExists)
}
If($strRDFExists -like "\\*")
{    
     $objOutput | Add-Member -Type NoteProperty -Name "RedirectedExist" -Value $($strRDFExists)
}

Here is the full script:

function Get-TermedADInformation
{
    [CmdletBinding()]
    [Alias()]
    [OutputType([int])]
    Param
    (

    )
    Begin
    {
        Write-Verbose "Adding starting variables."
        # Script Variables
        $ScriptLocation = '     "\\Server\C$\1T_Tools\Scheduled Tasks\ThreeMonthTermedUsers.ps1"'

        # Email Variables
        $MailTo = "helpdesk@Company.com"
        $MailFrom = "Alerts-Infrastructure@Company.com"
        $MailSubject = "Termed users in past 3 months"
        $MailBody = "*** This body uses Variables not this line ***"
        $MailRelay = "smtp.Company.com"

        $style = "TABLE{border-collapse: collapse;border: 1px solid black;width: 100%;}TH{border-collapse: collapse;border: 1px solid black;background-color: Gray;color: white;text-align:`"left`";}TD{font-size: .85em;border-collapse: collapse;border: 1px solid black;vertical-align:`"Bottom`";padding: 3px 7px 2px 7px;}"
        $Output = @()

        # Connect to On-Premise Exchange PowerShell
        Write-Verbose "Adding PSSession to On-Prem Exchange"
        $Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri http://Server.FQDN/PowerShell/ -Authentication Kerberos
        Import-PSSession $Session
        $SessionID = Get-PSSession | Where {$_.ComputerName -eq "Server.FQDN"} | select -ExpandProperty ID

        # Need to get all users that have been terminated in the past 3 months
		$ThreeMonths = (Get-Date).AddMonths(-3) # DO NOT CHANGE THIS, there are settings that will GSD.
        $FourMonths = (Get-Date).AddMonths(-4)
        Write-Verbose "Getting user information between dates  $ThreeMonths and  $FourMonths"
        $TermedUserInfo = (Get-ADUser -Filter * -SearchBase "OU=Terminated - Processed,DC=Company,DC=com" -Properties *) | Where-Object {$_.extensionAttribute1 -lt $ThreeMonths -and $_.extensionAttribute1 -gt $FourMonths} | select -Property Name, SamAccountName, Description, Title, PasswordLastSet, ProfilePath, Manager, extensionAttribute1
    }
    Process
    {
        try
        {
          Write-Verbose "Starting Foreach user..."
            Foreach($User in $TermedUserInfo)
            {
              Write-Verbose "Clearing user variables..."
                $strMoveSetting = 0
                $strForwardingAddress = ""
                $strRPExists = ""
                $strRDFExists = ""
                $UserRefreshed = ""
                $strForwardingAddress = Get-Mailbox -Identity ($User.SamAccountName) -ErrorAction SilentlyContinue | Where {$_.ForwardingAddress -ne $Null} | select -Property ForwardingAddress, UserPrincipalName
              
                  # Test for Roaming Profiles folder
                  Write-Verbose "Checking to see if Roaming Profile folders exists"
                    If(Test-Path "\\RoamingFolders\Profiles$\$($User.SamAccountName)*")
                    {
                        $strRPExists = "\\RoamingFolders\Profiles$"
                        Write-Verbose "Folder exists in $strRPExists"
                    }
                    ElseIf(Test-Path "\\PFS-UTH-02\ADRoaming$\$($User.SamAccountName)*")
                    {
                        $strRPExists = "\\PFS-UTH-02\ADRoaming$"
                        Write-Verbose "Folder exists in $strRPExists"
                    }
                    ElseIf(Test-Path "\\PDC-TOR-01\ADPROFILES$\$($User.SamAccountName)*")
                    {
                        $strRPExists = "\\PDC-TOR-01\ADPROFILES$"
                        Write-Verbose "Folder exists in $strRPExists"
                    }

                  # Test for Redirected Files folder
                  Write-Verbose "Checking to see if Redirected Files folder exists"
                    If(Test-Path "\\RoamingFolders\RedirectedFiles$\$($User.SamAccountName)")
                    {
                        $strRDFExists = "\\RoamingFolders\RedirectedFiles$"
                        Write-Verbose "Folder exists in $strRDFExists"
                    }
                    ElseIf(Test-Path "\\PFS-UTH-02\RoamingFiles$\$($User.SamAccountName)")
                    {
                        $strRDFExists = "\\PFS-UTH-02\RoamingFiles$"
                        Write-Verbose "Folder exists in $strRDFExists"
                    }
                    ElseIf(Test-Path "\\PDC-TOR-01\ADRoaming$\$($User.SamAccountName)")
                    {
                        $strRDFExists = "\\PDC-TOR-01\ADRoaming$"
                        Write-Verbose "Folder exists in $strRDFExists"
                    }

             # Getting work done - Time to make changes
               Write-Verbose "If the ProfilePath, Manager or FowardingAddress exist, it will be removed."
                If($User.ProfilePath)
                {
                    Set-ADUser -Identity $User.SamAccountName -Clear ProfilePath
                    Write-Verbose "$($User.SamAccountName) ProfilePath was removed"
                }
                If($User.Manager)
                {
                    Set-ADUser -Identity $User.SamAccountName -Clear Manager
                    Write-Verbose "$($User.SamAccountName) Manager was removed"
                }
                If($strForwardingAddress.UserPrincipalName)
                {
                    Set-Mailbox -Identity $strForwardingAddress.UserPrincipalName -ForwardingAddress $null -DeliverToMailboxAndForward $false
                    Write-Verbose "$($strForwardingAddress.UserPrincipalName) ForwardingAddress was removed."
                }
                

              Write-Verbose "Refreshing User and Mailbox information after the removel process..."
                $UserRefreshed = Get-ADUser -Identity $User.SamAccountName -Properties * | Select -Property ProfilePath, Manager
                $ForwardRefreshed = Get-Mailbox -Identity ($User.SamAccountName) -ErrorAction SilentlyContinue | Where {$_.ForwardingAddress -ne $Null} | select -Property ForwardingAddress, UserPrincipalName

            # Move the user to Terminated - Archive if the: Manager, ProfilePath, ForwardingAddress, RedirectedFiles and Profile Folders are empty.
              Write-Verbose "Moving user to Terminated - Archive, if ForwardingAddress, Manager, ProfilePath, RedirectedFiles and Profiles folder are cleaned up."
                If(($ForwardRefreshed.ForwardingAddress) -eq $Null -and ($UserRefreshed.Manager) -eq $Null -and ($UserRefreshed.ProfilePath) -eq $Null -and ($strRDFExists) -eq '' -and ($strRPExists) -eq '')
                {
                    Write-Verbose "$($User.Name) - Is moved to Terminated - Archived"
                    Get-ADUser $($User.SamAccountName) | Move-ADObject -TargetPath "OU=Terminated - Archive - No DirSync,DC=Company,DC=com"
                    $strMoveSetting = 1
                }
                # Start putting together the Output
              Write-Verbose "Gathering proper data to display in output..."
                $objOutput = New-Object System.Object
                $objOutput | Add-Member -Type NoteProperty -Name "Name" -Value $($User.Name)
				$objOutput | Add-Member -Type NoteProperty -Name "SamAccountName" -Value $($User.SamAccountName)
				$objOutput | Add-Member -Type NoteProperty -Name "Termed Date" -Value $($User.extensionAttribute1)
                    If($UserRefreshed.ProfilePath -ne $Null)
                    {
				        $objOutput | Add-Member -Type NoteProperty -Name "ProfilePath" -Value $($UserRefreshed.ProfilePath)
                    }
                    If($strRPExists -like "\\*")
                    {
                        $objOutput | Add-Member -Type NoteProperty -Name "ProfileExist" -Value $($strRPExists)
                    }
                    If($strRDFExists -like "\\*")
                    {    
                        $objOutput | Add-Member -Type NoteProperty -Name "RedirectedExist" -Value $($strRDFExists)
                    }
                    If($UserRefreshed.Manager)
                    {
				        $objOutput | Add-Member -Type NoteProperty -Name "Manager" -Value $((($UserRefreshed.Manager).Split(",")[0]).Split("=")[1])
                    }
                    If($strForwardingAddress.ForwardingAddress -ne $Null)
                    {
                        $objOutput | Add-Member -Type NoteProperty -Name "Forwarding Address" -Value $($ForwardRefreshed.ForwardingAddress)
                    }
                    If(!($strForwardingAddress.UserPrincipalName))
                    {
                        $objOutput | Add-Member -Type NoteProperty -Name "Forwarding Address" -Value (" `tUser not found On-Prem")
                    }
                    If($strMoveSetting -eq 1)
                    {
                        $objOutput | Add-Member -Type NoteProperty -Name "User Archived" -Value ("Yes")
                    }
                    Else
                    {
                        $objOutput | Add-Member -Type NoteProperty -Name "User Archived" -Value ("No")
                    }
				$Output += $objOutput
            }
        }
        finally
        {
            Write-Verbose "Cleaning Up ..."
            Write-Verbose "Removing SessionID"
            Remove-PSSession -Id $SessionID
        }
    }
    End
    {
        If($Output -ne $Null)
        {
            Write-Verbose "Sending Email..."
            $NewEMail = $Output | ConvertTo-Html -Head $Style
            Send-MailMessage -To $MailTo -From $MailFrom -Subject $MailSubject -BodyAsHtml "Start Date: $($FourMonths) - End Date: $($ThreeMonths) $($ScriptLocation) $($NewEMail)" -SmtpServer $MailRelay
        }
    }
} 
Get-TermedADInformation

Well, to my understanding, both ‘’ and “” are empty strings. They’re equal to [string]::Empty

In your code you’re setting the variables strRPExists and strRDFExists to empty strings:

$strRPExists = ""
$strRDFExists = ""

An empty string is not the same as $null, there is a good writeup on $null in PowerShell over here: http://www.zeninteractions.com/2013/10/17/checking-for-null-in-powershell/

If you want to determine is strings are empty you can use the use the following statements:

[string]::IsNullOrEmpty($strRPExist)
[string]::IsNullOrWhiteSpace($strRPExist)

This allows you to test for the scenarios in your script and gives you a bit more flexibility than testing vs $null.

Thank you Daniël and Jaap, I will do some more testing in order to get a better understanding.