2010-02-25 14 views
5

Non riesco a far funzionare uno script PowerShell. Sono molto nuovo a PowerShell quindi potrebbe mancare qualcosa di stupido.Errore di caricamento ftp Powershell 530 non registrato

$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() 

ottengo il seguente errore:

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(<<<<) 

posso collegare tramite IE ad esso facilmente in modo pensato che forse qualcosa non andava così ha fatto in fretta in 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(); 

Il C# funziona perfettamente, non è sicuro del motivo per cui questo non funziona e spero che qualcuno possa essere in grado di segnalare il mio errore

EDIT

Risolto, nuovo sarebbe qualcosa di stupido. La password aveva un segno "$", era tra virgolette, ma non avevo capito che avrebbe dovuto essere scappato, semplicemente non ci pensava affatto. Ironia della sorte ho dovuto cambiare la password ecc in modo che fosse sicuro di postare.

+1

Non riesco a vedere nulla. L'unica differenza è che usi 'UsePassive' nella tua soluzione C#. Per evitare errori potresti usare 'Set-StrictMode -version ...' per evitare variabili non inizializzate (= errori di battitura), ma in questo caso penso che non porterà nulla di nuovo. – stej

+0

Ciao Stej, grazie per la risposta. Sono contento che non sia solo io, ho provato a replicare il C# in PowerShell. – Jon

+0

Molti errori portano a 'problema $' con virgolette doppie :) – stej

risposta

2

dal poster originale Jon:

risolto, nuovo sarebbe qualcosa di stupido. La password aveva un segno "$", era tra virgolette, ma non avevo capito che avrebbe dovuto essere scappato, semplicemente non ci pensava affatto. Ironia della sorte ho dovuto cambiare la password ecc in modo che fosse sicuro di postare.

0

è sufficiente rimuovere la doppia virgoletta dal nome utente o dalla password perché talvolta il segno $ causa problemi. È buono usare ogni volta una virgoletta singola.

Problemi correlati