在PowerShell中检查FTP服务器上的文件是否存在
解决FTP文件存在性检查与文件大小格式化问题
嘿,我看你在处理FTP相关脚本时碰到了两个头疼的问题:一是用Test-Path没法正常检查FTP服务器上的指定文件,二是你写的File-size函数不仅没完成,还没法正常工作。别着急,咱们一步步来把这些问题搞定。
1. 为什么Test-Path对FTP路径无效?
Test-Path是PowerShell针对本地文件系统或SMB共享设计的命令,默认不支持FTP协议。要检查FTP上的文件是否存在,咱们得用.NET的FtpWebRequest来实现,它能直接和FTP服务器交互。
实现FTP文件存在性检查的函数
function Test-FtpFileExists { param( [Parameter(Mandatory=$true)] [string]$FtpUrl, # 格式示例: ftp://your-ftp-server.com/path/to/target-file.txt [Parameter(Mandatory=$true)] [string]$Username, [string]$Password = "" # 匿名FTP可以留空 ) try { # 创建FTP请求,尝试获取文件大小 $request = [System.Net.FtpWebRequest]::Create($FtpUrl) $request.Method = [System.Net.WebRequestMethods+Ftp]::GetFileSize $request.Credentials = New-Object System.Net.NetworkCredential($Username, $Password) # 如果能成功获取响应,说明文件存在 $response = $request.GetResponse() $response.Close() return $true } catch [System.Net.WebException] { # FTP错误码550表示"文件不存在或无法访问" if ($_.Exception.Response.StatusCode -eq [System.Net.FtpStatusCode]::ActionNotTakenFileUnavailable) { return $false } else { # 其他错误(比如权限不足),直接抛出异常 throw $_.Exception } } } # 使用示例 Test-FtpFileExists -FtpUrl "ftp://example.com/docs/report.pdf" -Username "ftp-user" -Password "your-pass"
这个函数的逻辑很简单:通过尝试获取文件大小来判断文件是否存在——如果服务器返回550错误,就说明文件不存在;否则就是存在的。
2. 修复并完善你的File-size函数
你的函数逻辑框架是对的,但没写完最后一个else分支,而且参数类型建议用long(避免大文件大小溢出)。这里给你补全并优化两种版本:
版本1:补全你原来的if-else逻辑
function File-Size { param( [Parameter(Mandatory=$true)] [long]$Size # 用long类型支持超大文件(最大9EB左右) ) if ($Size -gt 1TB) { [string]::Format("{0:0.00} TB", $Size / 1TB) } elseif ($Size -gt 1GB) { [string]::Format("{0:0.00} GB", $Size / 1GB) } elseif ($Size -gt 1MB) { [string]::Format("{0:0.00} MB", $Size / 1MB) } elseif ($Size -gt 1KB) { [string]::Format("{0:0.00} KB", $Size / 1KB) } else { # 处理小于1KB的情况,直接显示字节数 [string]::Format("{0} Bytes", $Size) } } # 使用示例 File-Size -Size 123456789 # 输出: 117.74 MB File-Size -Size 987 # 输出: 987 Bytes
版本2:用Switch语句简化逻辑(更简洁)
function File-Size { param( [Parameter(Mandatory=$true)] [long]$Size ) switch -Regex ($Size.ToString()) { '^[0-9]{1,3}$' { return "$Size Bytes" } '^[0-9]{4,6}$' { return "{0:0.00} KB" -f ($Size / 1KB) } '^[0-9]{7,9}$' { return "{0:0.00} MB" -f ($Size / 1MB) } '^[0-9]{10,12}$' { return "{0:0.00} GB" -f ($Size / 1GB) } '^[0-9]{13,}$' { return "{0:0.00} TB" -f ($Size / 1TB) } } }
3. 结合两者:检查FTP文件+获取格式化后的大小
如果需要一步完成“检查文件是否存在+获取并格式化大小”,可以把两个函数结合起来:
function Get-FtpFileFormattedSize { param( [Parameter(Mandatory=$true)] [string]$FtpUrl, [Parameter(Mandatory=$true)] [string]$Username, [string]$Password = "" ) try { $request = [System.Net.FtpWebRequest]::Create($FtpUrl) $request.Method = [System.Net.WebRequestMethods+Ftp]::GetFileSize $request.Credentials = New-Object System.Net.NetworkCredential($Username, $Password) $response = $request.GetResponse() $fileSize = $response.ContentLength $response.Close() # 调用File-Size函数格式化大小 return File-Size -Size $fileSize } catch [System.Net.WebException] { if ($_.Exception.Response.StatusCode -eq [System.Net.FtpStatusCode]::ActionNotTakenFileUnavailable) { Write-Warning "指定文件不存在: $FtpUrl" return $null } else { throw $_.Exception } } } # 使用示例 Get-FtpFileFormattedSize -FtpUrl "ftp://example.com/large-file.iso" -Username "ftp-user" -Password "your-pass"
这样就能一次性完成你需要的两个操作啦!
内容的提问来源于stack exchange,提问作者user9161162
相关产品推荐
相关产品推荐

