在我的 PowerShell FTP 脚本中转义 @ 字符

Escape the @ character in my PowerShell FTP script

我想将一些数据上传到三个不同的 FTP 服务器。它适用于三台服务器中的两台。它不适用于第三台服务器的原因是,密码中有一个 @-sign,我无法逃脱它。它只是行不通。抱歉,我不能告诉你密码,但想象一下 ftp://username:p@ssword@ftp-server.com。 PowerShell 现在认为,密码已经停止在第一个 @ 符号处,但事实并非如此。所以 PowerShell 使用的密码是错误的,FTP 服务器的地址也是错误的。

我尝试使用“@”或 ASCII 代码 [char]64 或作为参数转义它。 我真的不知道还能尝试什么...

$request = [Net.WebRequest]::Create("ftp://username:p@ssword@example.com/")
$request.Method = [System.Net.WebRequestMethods+Ftp]::UploadFile 

$fileStream = [System.IO.File]::OpenRead("C:\Users\Desktop\file.zip")
$ftpStream = $request.GetRequestStream()

$buffer = New-Object Byte[] 10240
while (($read = $fileStream.Read($buffer, 0, $buffer.Length)) -gt 0)
{
    $ftpStream.Write($buffer, 0, $read)
    $pct = ($fileStream.Position / $fileStream.Length)
    Write-Progress `
        -Activity "Uploading" -Status ("{0:P0} complete:" -f $pct) `
        -PercentComplete ($pct * 100)
}

$fileStream.CopyTo($ftpStream)

$ftpStream.Dispose()
$fileStream.Dispose()

最简单的方法是使用 WebRequest.Credentials 而不是在 URL:

中指定凭据
$request = [Net.WebRequest]::Create("ftp://example.com/")
$request.Credentials = New-Object System.Net.NetworkCredential("username", "p@ssword") 

或者,您可以使用 Uri.EscapeDataString:

$encodedPassword = [Uri]::EscapeDataString("p@ssword") 
$request = [Net.WebRequest]::Create("ftp://username:$encodedPassword@example.com/")

它会给你:p%40ssword – 了解URL encoding


WebClient 类似: