简短的回答
if(-Not(Test-Path "filesystem::\\$server\c$")) {Write-Error "Server not found: $server"; continue}
如果测试路径意外失败,请确保在客户端和目标服务器上都设置了 SMB2=1(或其他 SMB 设置) 。
更多信息
重要 SMB 注意:当前系统和目标系统都必须至少启用一个通用 SMB 协议才能使测试路径成功。(强烈建议使用 SMB2 或更高版本。)例如,如果目标启用了 SMB1 + 禁用了 SMB2,并且客户端仅启用了 SMB2,则上述逻辑将返回"Server not found..."。这让我偏离了轨道,直到我最终检查了我的目标服务器(Win7)并发现它有 SMB2=0(禁用)并且没有 SMB1 条目(默认启用)。我通过在下面的每篇文章中设置 SMB2=1 来修复。
SMB 操作系统特定和脚本详细信息:https: //support.microsoft.com/en-us/help/2696547/detect-enable-disable-smbv1-smbv2-smbv3-in-windows-and-windows-server
摘录:Win8/Win20012
Detect: Get-SmbServerConfiguration | Select EnableSMB1Protocol
Disable: Set-SmbServerConfiguration -EnableSMB1Protocol $false
Enable: Set-SmbServerConfiguration -EnableSMB1Protocol $true
摘录: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
代码示例:仅在目标服务器存在时复制项目文件夹(递归)
$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."
}