2010-02-25 10 views
5

Próbuję uruchomić skrypt PowerShell. Jestem bardzo nowy w PowerShell, więc może zabraknąć czegoś głupiego.Powershell ftp błąd przesyłania 530 niezalogowany

$sourceuri = "ftp://ftp.example.com/myfolder/myfile.xml" 
$username = "user" 
$password = "password" 

# Create a FTPWebRequest object to handle the connection to the ftp server 
$ftprequest = [System.Net.FtpWebRequest]::create($sourceuri) 

$credentials = New-Object System.Net.NetworkCredential($username,$password) 
# set the request's network credentials for an authenticated connection 
$ftprequest.Credentials = $credentials 

$ftprequest.Method = [System.Net.WebRequestMethods+Ftp]::UploadFile 
$ftprequest.UseBinary = 1 
$ftprequest.KeepAlive = 0 

# read in the file to upload as a byte array 
$content = gc -en byte $fileName 
$ftprequest.ContentLength = $content.Length 
# get the request stream, and write the bytes into it 
$rs = $ftprequest.GetRequestStream() 
$rs.Write($content, 0, $content.Length) 
# be sure to clean up after ourselves 
$rs.Close() 
$rs.Dispose() 

pojawia się następujący błąd:

Exception calling "GetRequestStream" with "0" argument(s): "The remote server returned an error: (530) Not logged in." 
At C:\temp\copyfile.ps1:63 char:35 
+ $rs = $ftprequest.GetRequestStream(<<<<) 

mogę połączyć poprzez IE do niego łatwo tak, że może jeszcze coś było nie tak, więc zrobił to szybko w C#:

 string filePath = @"C:\temp\myfile.xml"; 
     string FTPAddress = @"ftp://ftp.example.com/myfolder"; 
     FtpWebRequest request = (FtpWebRequest)FtpWebRequest.Create(FTPAddress + "/" + Path.GetFileName(filePath)); 
     request.Method = WebRequestMethods.Ftp.UploadFile; 
     string username = "user"; 
     string password = "password"; 
     request.Credentials = new NetworkCredential(username, password); 
     request.UsePassive = true; 
     request.UseBinary = true; 
     request.KeepAlive = false; 

     FileInfo file = new FileInfo(filePath); 
     request.ContentLength = file.Length; 
     int buffLength = 2048; 
     byte[] buff = new byte[buffLength]; 
     int contentLen; 

     FileStream fs = file.OpenRead(); 

     Stream strm = request.GetRequestStream(); 
     contentLen = fs.Read(buff, 0, buffLength); 
     while(contentLen !=0) 
     { 
      strm.Write(buff, 0, contentLen); 
      contentLen = fs.Read(buff, 0, buffLength); 
     } 

     strm.Close(); 
     fs.Close(); 

The C# działa idealnie, nie wiem, dlaczego to nie działa i mam nadzieję, że ktoś może wskazać mój błąd.

EDIT

Rozwiązał to, nowe byłoby coś głupiego. Hasło zawierało znak "$", zawierało się w podwójnych cudzysłowach, ale nie zdawałem sobie sprawy, że trzeba uciec, ale w ogóle o tym nie myślałem. Jak na ironię musiałem zmienić hasło itp., Aby można było bezpiecznie publikować.

+1

Nic nie widzę. Jedyna różnica polega na tym, że używasz rozwiązania "UsePassive" w swoim C#. Aby uniknąć błędów, możesz użyć 'Set-StrictMode -version ...', aby uniknąć niezainicjowanych zmiennych (= literówek), ale w tym przypadku myślę, że nie przyniesie nic nowego. – stej

+0

Cześć Stej, dzięki za odpowiedź. Cieszę się, że to nie tylko ja, próbowałem replikować C# w PowerShell. – Jon

+0

Wiele błędów prowadzi do "problemu $" z podwójnymi cudzysłowami :) – stej

Odpowiedz

2

Od oryginalnego plakatu Jon:

rozwiązać go, nowy byłoby coś głupiego. Hasło zawierało znak "$", zawierało się w podwójnych cudzysłowach, ale nie zdawałem sobie sprawy, że trzeba uciec, ale w ogóle o tym nie myślałem. Jak na ironię musiałem zmienić hasło itp., Aby można było bezpiecznie publikować.

0

wystarczy usunąć podwójny cudzysłów z nazwy użytkownika lub hasła, ponieważ czasami znak $ powoduje problem. Dobrze jest używać pojedynczego cudzysłowu za każdym razem.

Powiązane problemy