#c# #powershell
Вопрос:
У меня есть следующий код на C#, который отлично работает в VS. Я новичок в Powershell, и мне трудно передать массив строк в основной метод. (Я получаю глупую ошибку, в которой говорится, что мой пост-это в основном код, поэтому мне нужно ввести еще немного бесполезного текста. Итак, как погода там, где вы находитесь?
$code = @" // omitted section public class AsynchronousFtpUpLoader { // Command line arguments are two strings: // 1. The url that is the name of the file being uploaded to the server. // 2. The name of the file on the local machine. // public static void Main(string[] args) { // Create a Uri instance with the specified URI string. // If the URI is not correctly formed, the Uri constructor // will throw an exception. ManualResetEvent waitObject; Uri target = new Uri(args[0]); string fileName = args[1]; FtpState state = new FtpState(); FtpWebRequest request = (FtpWebRequest)WebRequest.Create(target); request.Method = WebRequestMethods.Ftp.UploadFile; // This example uses anonymous logon. // The request is anonymous by default; the credential does not have to be specified. // The example specifies the credential only to // control how actions are logged on the server. request.Credentials = new NetworkCredential("anonymous", "anonymous"); // Store the request in the object that we pass into the // asynchronous operations. state.Request = request; state.FileName = fileName; // Get the event to wait on. waitObject = state.OperationComplete; // Asynchronously get the stream for the file contents. request.BeginGetRequestStream( new AsyncCallback(EndGetStreamCallback), state ); // Block the current thread until all operations are complete. waitObject.WaitOne(); // The operations either completed or threw an exception. if (state.OperationException != null) { throw state.OperationException; } else { Console.WriteLine("The operation completed - {0}", state.StatusDescription); } } private static void EndGetStreamCallback(IAsyncResult ar) { FtpState state = (FtpState)ar.AsyncState; Stream requestStream = null; // End the asynchronous call to get the request stream. try { requestStream = state.Request.EndGetRequestStream(ar); // Copy the file contents to the request stream. const int bufferLength = 2048; byte[] buffer = new byte[bufferLength]; int count = 0; int readBytes = 0; FileStream stream = File.OpenRead(state.FileName); do { readBytes = stream.Read(buffer, 0, bufferLength); requestStream.Write(buffer, 0, readBytes); count = readBytes; } while (readBytes != 0); Console.WriteLine("Writing {0} bytes to the stream.", count); // IMPORTANT: Close the request stream before sending the request. requestStream.Close(); // Asynchronously get the response to the upload request. state.Request.BeginGetResponse( new AsyncCallback(EndGetResponseCallback), state ); } // Return exceptions to the main application thread. catch (Exception e) { Console.WriteLine("Could not get the request stream."); state.OperationException = e; state.OperationComplete.Set(); return; } } // The EndGetResponseCallback method // completes a call to BeginGetResponse. private static void EndGetResponseCallback(IAsyncResult ar) { FtpState state = (FtpState)ar.AsyncState; FtpWebResponse response = null; try { response = (FtpWebResponse)state.Request.EndGetResponse(ar); response.Close(); state.StatusDescription = response.StatusDescription; // Signal the main application thread that // the operation is complete. state.OperationComplete.Set(); } // Return exceptions to the main application thread. catch (Exception e) { Console.WriteLine("Error getting response."); state.OperationException = e; state.OperationComplete.Set(); } } } } "@ Add-Type -TypeDefinition $code -Language CSharp $url = "ftp://anonymous-site.com/Uploads/cert_$env:username.pfx" $sourceFilePath = $home "cert_$env:username.pfx" $cmd = "[FTPFileUpload.AsynchronousFtpUpLoader]::Main(**Need help here**)" iex $cmd
Комментарии:
1. Вам не нужно
iex
,[FTPFileUpload.AsynchronousFtpUpLoader]::Main(@($url, $sourceFilePath))
сделаю2. Обязанный. Формирование массива для передачи бросало меня ( ;^Dgt;
Ответ №1:
Как упоминалось в комментариях, вам не нужно Invoke-Expression
(или его псевдоним iex
) вызывать метод — вам просто нужно убедиться, что вы передаете ему массив строк в качестве одного аргумента параметра:
[FTPFileUpload.AsynchronousFtpUpLoader]::Main(@($url, $sourceFilePath))
Если вы на самом деле не собираетесь запускать это как отдельное консольное приложение, вы также можете изменить подпись метода:
public static void UploadFile(Uri target, string fileName) { ManualResetEvent waitObject; FtpState state = new FtpState(); FtpWebRequest request = (FtpWebRequest)WebRequest.Create(target); request.Method = WebRequestMethods.Ftp.UploadFile; // ... etc. }
Для гораздо менее неудобного вызова в PowerShell:
[FTPFileUpload.AsynchronousFtpUpLoader]::UploadFile($url, $sourceFilePath)