Избегайте символа @ в моем сценарии PowerShell FTP - PullRequest
1 голос
/ 11 июня 2019

Я хочу загрузить некоторые данные на три разных FTP-сервера. Это работает для двух из трех серверов. Причина, по которой он не работает для третьего сервера, заключается в том, что в пароле есть знак @, и я не могу его избежать. Это просто не работает. Извините, я не могу показать вам пароль, но представьте себе 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()

1 Ответ

0 голосов
/ 11 июня 2019

Проще всего использовать 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 .


Аналогично для WebClient: Использованиеспециальные символы (косая черта) в учетных данных FTP с WebClient

...