在我的 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
类似:
我想将一些数据上传到三个不同的 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
类似: