You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:44:33