PowerShell Test-Path returns False when testing a network share

前端 未结 6 1424
余生分开走
余生分开走 2021-01-05 03:00

The user has appropriate permissions to read the share, and the share maps properly. This issue seems to happen only in PowerShell v2.0.

If I remove all mapped drive

相关标签:
6条回答
  • 2021-01-05 03:23

    I do think I found the answer with this:

    Test-Path $('filesystem::\\Server\share$\install.wim')
    
    0 讨论(0)
  • 2021-01-05 03:25

    For me the only way to fix it was to use the full UNC, rather than the share name.

    So instead of \\server\share I used \\server\c$\sharedir.

    Another issue I ran into was when using Import-Module sqlps, I had to make sure to CD back into the file system and then the PowerShell commands worked normally.

    0 讨论(0)
  • 2021-01-05 03:27

    I had the exact same problem trying two network paths like this:

    $verif_X = Test-Path "X:\"
    $verif_S = Test-Path "S:\"
    if($verif_X -and $verif_S){
        Write-Host "X: and S: network paths found"
    }
    else{
        Write-Host "Not all network paths found"
    }
    

    ... At first, I always got > "Not all network paths found" which seemed really strange to me...

    Then I tried to put those paths in simple quotes (') and searched for an existing folder inside those both network paths like this:

    $verif_X = Test-Path 'X:\ISOs'
    $verif_S = Test-Path 'S:\Scripts'
    

    And then

    if($verif_X -and $verif_S){[..]}
    

    condition is accepted..

    I think the Test-path cmdlet is a bit buggy as we enter only the first letter of a network path... but like this I do not get errors any more...

    0 讨论(0)
  • 2021-01-05 03:30

    If the Test-Path cmdlet is truly buggy, then I'd suggest using the Exists() method on the System.IO.Directory .NET class.

    [System.IO.Directory]::Exists('G:\'); # This returns $true for me
    
    0 讨论(0)
  • 2021-01-05 03:34

    To validate a UNC, use:

    [bool]([System.Uri]$path).IsUnc
    
    0 讨论(0)
  • 2021-01-05 03:37

    SHORT ANSWER

    if(-Not(Test-Path "filesystem::\\$server\c$")) {Write-Error "Server not found: $server"; continue} If Test-Path fails unexpectedly then make sure SMB2=1 (or other SMB setting) is set on both client and target server.

    MORE INFO

    IMPORTANT SMB NOTE: Both current system and target system must have at least on common SMB protocol enabled for Test-Path to succeed. (SMB2 or later strongly recommended.) For example, if target has SMB1 enabled + SMB2 disabled and client has only SMB2 enabled then logic above will return "Server not found...". This threw me off track until I finally checked my target server (Win7) and found it had SMB2=0 (disabled) and no entry for SMB1 (enabled by default). I fixed by setting SMB2=1 per article below.

    SMB OS-specific and scripting details: https://support.microsoft.com/en-us/help/2696547/detect-enable-disable-smbv1-smbv2-smbv3-in-windows-and-windows-server

    Excerpt: Win8/Win20012

    Detect: Get-SmbServerConfiguration | Select EnableSMB1Protocol
    Disable:    Set-SmbServerConfiguration -EnableSMB1Protocol $false
    Enable: Set-SmbServerConfiguration -EnableSMB1Protocol $true
    

    Excerpt: Win7/Win2008R2Server

    Detect:
    Get-Item HKLM:\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters | ForEach-Object {Get-ItemProperty $_.pspath}
    Default configuration = Enabled (No registry key is created), so no SMB1 value will be returned
    
    Disable:
    Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters" SMB1 -Type DWORD -Value 0 –Force
    
    Enable:
    Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters" SMB1 -Type DWORD -Value 1 –Force
    

    Code sample: Copy-Item a folder (recursive) only if target server exists

    $scriptRootPath="." 
    $scriptToolsPath="$scriptRootPath\Tools" 
    $targetServerList="$scriptToolsPath\DeployServerList-INT-POC.txt"   #DeployServerList-INT.txt, DeployServerList-QA.txt, DeployServerList-PROD.txt
    $stageTargetDrive="c"
    $stageFolderPath="$stageTargetDrive$\staging"
    
    $VerbosePreference="Continue"                                       #"SilentlyContinue" (default), "Continue", "Stop", "Inquire"
    $InformationPreference="Continue"
    
    Write-Host "Getting list of servers from $targetServerList to stage deployment files to..."
        $serverList = (get-content "$targetServerList")
        Write-Verbose "scriptToolsPath=$scriptToolsPath"
        Write-Verbose "serverlist=$serverList"
        Write-Verbose "stageFolderPath=$StageFolderPath"
    
    Write-Host -Separator "-"
    Read-Host -Prompt "READY TO STAGE FILES: Check info above, then press Enter to continue (or Ctrl+C to exit)."
    Write-Host "-------------------------------------------------"
    
    Write-Host "Staging files to $stageFolderPath on each target server..."
    foreach ($server in $serverlist) {
        # Input validation
        if([string]::IsNullOrWhiteSpace($server)) {continue}
        if($server.StartsWith("#")) {Write-Verbose "Comment skipped: $server"; continue}    # Skip line if line begins with hashtag comment char
        Write-Verbose "Testing filesystem access to $server..."
        if(-Not(Test-Path "filesystem::\\$server\$stageTargetDrive$")) {Write-Error "Server not found: $server"; continue}
            # TIP: If Test-Path returns false unexpectedly then check if SMB2 is enabled on target server, check SMB1 disabled for both src and target servers.
    
        Write-Verbose "Staging files to $server..."
        Copy-Item ".\" -Destination "\\$server\$stageFolderPath" -Recurse -Force -ErrorAction Continue
        Write-Information "Files staged on $server."
    } 
    
    0 讨论(0)
提交回复
热议问题