কমান্ডলাইন আর্গুমেন্টের সাহায্যে সি # থেকে পাওয়ারশেল স্ক্রিপ্ট কার্যকর করুন


102

আমার # সি এর মধ্যে থেকে পাওয়ারশেল স্ক্রিপ্ট চালানো দরকার। স্ক্রিপ্টের কমান্ডলাইন আর্গুমেন্টগুলির প্রয়োজন।

আমি এ পর্যন্ত এটিই করেছি:

RunspaceConfiguration runspaceConfiguration = RunspaceConfiguration.Create();

Runspace runspace = RunspaceFactory.CreateRunspace(runspaceConfiguration);
runspace.Open();

RunspaceInvoke scriptInvoker = new RunspaceInvoke(runspace);

Pipeline pipeline = runspace.CreatePipeline();
pipeline.Commands.Add(scriptFile);

// Execute PowerShell script
results = pipeline.Invoke();

স্ক্রিপ্টফাইলে "সি: \ প্রোগ্রাম ফাইলগুলি \ মাইপ্রোগ্রাম \ যিনিও। পিএস 1" এর মতো কিছু রয়েছে।

স্ক্রিপ্টটি "-key মান" এর মতো একটি কমান্ডলাইন আর্গুমেন্ট ব্যবহার করে যখন মানটি এমন একটি পথের মতো হতে পারে যাতে স্পেস থাকতে পারে।

আমি এই কাজ করতে না। কী কেউ সি # এর মধ্যে থেকে পাওয়ারশেল স্ক্রিপ্টে কমান্ডলাইন আর্গুমেন্টগুলি পাস করতে এবং স্পেসগুলি কোনও সমস্যা না হওয়ার বিষয়টি নিশ্চিত করে?


4
কেবল ভবিষ্যতের ব্যবহারকারীদের জন্য স্পষ্ট করার জন্য, গৃহীত উত্তরগুলি ব্যবহারের পরামিতি ছাড়াই স্পেস নিয়ে সমস্যা থাকা লোকদের সমস্যার সমাধান করে। ব্যবহার: Command myCommand = new Command(scriptfile);এবং তারপরে pipeline.Commands.Add(myCommand);পালানোর সমস্যাটি সমাধান করুন।
scharette

উত্তর:


113

আলাদা কমান্ড হিসাবে স্ক্রিপ্টফিল তৈরি করার চেষ্টা করুন:

Command myCommand = new Command(scriptfile);

তারপরে আপনি এর সাথে প্যারামিটার যুক্ত করতে পারেন

CommandParameter testParam = new CommandParameter("key","value");
myCommand.Parameters.Add(testParam);

এবং পরিশেষে

pipeline.Commands.Add(myCommand);

এখানে সম্পূর্ণ, সম্পাদিত কোডটি রয়েছে:

RunspaceConfiguration runspaceConfiguration = RunspaceConfiguration.Create();

Runspace runspace = RunspaceFactory.CreateRunspace(runspaceConfiguration);
runspace.Open();

RunspaceInvoke scriptInvoker = new RunspaceInvoke(runspace);

Pipeline pipeline = runspace.CreatePipeline();

//Here's how you add a new script with arguments
Command myCommand = new Command(scriptfile);
CommandParameter testParam = new CommandParameter("key","value");
myCommand.Parameters.Add(testParam);

pipeline.Commands.Add(myCommand);

// Execute PowerShell script
results = pipeline.Invoke();

আমার এখনও সমস্যা আছে বলে মনে হচ্ছে যে মানটি সি: \ প্রোগ্রাম ফাইলগুলি \ মাইপোগ্রামের মতো কিছু হলে, কীটি সি: \ প্রোগ্রামে সেট করা থাকে। :(
মেফিসটোয়

4
কিছু মনে করো না. কখনও কখনও এটি সাহায্য করে যখন আপনি সঠিকভাবে স্ট্রিংগুলি বিভক্ত করতে জানেন। ;-) আবারও ধন্যবাদ, আপনার সমাধান আমার সমস্যা সমাধানে আমাকে সহায়তা করেছে!
মফিসটোয়

@ ট্রোনেক্স - আপনার স্ক্রিপ্টটির প্যারামিটার হিসাবে কীটি সংজ্ঞায়িত করা উচিত। পাওয়ারশেলের পাথের সাথে কাজ করার জন্য কিছু দুর্দান্ত বিল্টিন সরঞ্জাম রয়েছে। সে সম্পর্কে আরও একটি প্রশ্ন জিজ্ঞাসা করুন। @ Kosi2801 এর পরামিতিগুলি যুক্ত করার সঠিক উত্তর রয়েছে।
স্টিভেন মুরাউস্কি

আমার উত্তরটি টাইপ করায় আপনার ওভারল্যাপ হয়ে গেলো .. আমি খুশি হয়েছি যে আপনি এটি সমাধান করেছেন!
স্টিভেন মুরাউস্কি

4
স্ক্রিপ্টআইভোকার ভেরিয়েবল ব্যবহার হচ্ছে না।
নিয়াহের

34

আমার আর একটি সমাধান আছে। পাওয়ারশেল স্ক্রিপ্ট কার্যকর করা সফল হয় কিনা তা আমি কেবল পরীক্ষা করতে চাই, কারণ সম্ভবত কেউ নীতি পরিবর্তন করতে পারে। যুক্তি হিসাবে, আমি কেবল সম্পাদনের জন্য স্ক্রিপ্টের পথটি নির্দিষ্ট করেছি।

ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.FileName = @"powershell.exe";
startInfo.Arguments = @"& 'c:\Scripts\test.ps1'";
startInfo.RedirectStandardOutput = true;
startInfo.RedirectStandardError = true;
startInfo.UseShellExecute = false;
startInfo.CreateNoWindow = true;
Process process = new Process();
process.StartInfo = startInfo;
process.Start();

string output = process.StandardOutput.ReadToEnd();
Assert.IsTrue(output.Contains("StringToBeVerifiedInAUnitTest"));

string errors = process.StandardError.ReadToEnd();
Assert.IsTrue(string.IsNullOrEmpty(errors));

স্ক্রিপ্টের বিষয়বস্তু সহ:

$someVariable = "StringToBeVerifiedInAUnitTest"
$someVariable

4
ওহে. আপনার বর্ণনা রয়েছে যে আপনি সমস্ত কমান্ড প্রক্রিয়া বর্ণনা করার সাথে সাথে আমাদের কমান্ড প্রক্রিয়াটি (যেমন আমাদের ক্ষেত্রে) প্রস্থান না করে পাওয়ারশেল শুরু করা কেন প্রস্থান করে না?
ইউজিনিউ টোরিকা

আপনি কোন গ্রন্থাগারটি ব্যবহার করছেন
সফটওয়্যারসভেন্ট

11

কমান্ডস.এডসস্ক্রিপ্ট পদ্ধতিতে প্যারামিটারগুলি পাস করতে আমার সমস্যা হয়েছিল।

C:\Foo1.PS1 Hello World Hunger
C:\Foo2.PS1 Hello World

scriptFile = "C:\Foo1.PS1"

parameters = "parm1 parm2 parm3" ... variable length of params

nullনাম এবং পরম হিসাবে মান হিসাবে সংগ্রহের মধ্যে দিয়ে আমি এটি সমাধান করেছিCommandParameters

এখানে আমার ফাংশন:

private static void RunPowershellScript(string scriptFile, string scriptParameters)
{
    RunspaceConfiguration runspaceConfiguration = RunspaceConfiguration.Create();
    Runspace runspace = RunspaceFactory.CreateRunspace(runspaceConfiguration);
    runspace.Open();
    RunspaceInvoke scriptInvoker = new RunspaceInvoke(runspace);
    Pipeline pipeline = runspace.CreatePipeline();
    Command scriptCommand = new Command(scriptFile);
    Collection<CommandParameter> commandParameters = new Collection<CommandParameter>();
    foreach (string scriptParameter in scriptParameters.Split(' '))
    {
        CommandParameter commandParm = new CommandParameter(null, scriptParameter);
        commandParameters.Add(commandParm);
        scriptCommand.Parameters.Add(commandParm);
    }
    pipeline.Commands.Add(scriptCommand);
    Collection<PSObject> psObjects;
    psObjects = pipeline.Invoke();
}

সবেমাত্র যুক্ত হয়েছে:using (Runspace runspace = RunspaceFactory.CreateRunspace(runspaceConfiguration))...using (Pipeline pipeline = runspace.CreatePipeline())
লাল

যখন আমি একাধিক প্যারামিটার ক্ষণস্থায়ী হই, তবে এই ত্রুটি দেখা দেয়: টাইপ 'System.Management.Automation.ParseException' একটি Unhandled ব্যতিক্রম System.Management.Automation.dll ঘটেছে
মুহাম্মাদ নোমান

5

আপনি অ্যাডস্ক্রিপ্ট পদ্ধতির সাহায্যে পাইপলাইনটি কেবল ব্যবহার করতে পারেন:

string cmdArg = ".\script.ps1 -foo bar"            
Collection<PSObject> psresults;
using (Pipeline pipeline = _runspace.CreatePipeline())
            {
                pipeline.Commands.AddScript(cmdArg);
                pipeline.Commands[0].MergeMyResults(PipelineResultTypes.Error, PipelineResultTypes.Output);
                psresults = pipeline.Invoke();
            }
return psresults;

এটি একটি স্ট্রিং নেবে এবং আপনি যে কোনও পরামিতি এটি পাস করেন।


4

খনিটি কিছুটা ছোট এবং সরল:

/// <summary>
/// Runs a PowerShell script taking it's path and parameters.
/// </summary>
/// <param name="scriptFullPath">The full file path for the .ps1 file.</param>
/// <param name="parameters">The parameters for the script, can be null.</param>
/// <returns>The output from the PowerShell execution.</returns>
public static ICollection<PSObject> RunScript(string scriptFullPath, ICollection<CommandParameter> parameters = null)
{
    var runspace = RunspaceFactory.CreateRunspace();
    runspace.Open();
    var pipeline = runspace.CreatePipeline();
    var cmd = new Command(scriptFullPath);
    if (parameters != null)
    {
        foreach (var p in parameters)
        {
            cmd.Parameters.Add(p);
        }
    }
    pipeline.Commands.Add(cmd);
    var results = pipeline.Invoke();
    pipeline.Dispose();
    runspace.Dispose();
    return results;
}

3

স্ক্রিপ্টে প্যারামিটার যুক্ত করার একটি উপায় এখানে আপনি ব্যবহার করেন is

pipeline.Commands.AddScript(Script);

এটি হ্যাশম্যাপকে প্যারামিটার হিসাবে ব্যবহার করার সাথে সাথে স্ক্রিপ্টের ভেরিয়েবলের নাম এবং মানটি ভেরিয়েবলের মান।

pipeline.Commands.AddScript(script));
FillVariables(pipeline, scriptParameter);
Collection<PSObject> results = pipeline.Invoke();

এবং ফিল ভেরিয়েবল পদ্ধতিটি হ'ল:

private static void FillVariables(Pipeline pipeline, Hashtable scriptParameters)
{
  // Add additional variables to PowerShell
  if (scriptParameters != null)
  {
    foreach (DictionaryEntry entry in scriptParameters)
    {
      CommandParameter Param = new CommandParameter(entry.Key as String, entry.Value);
      pipeline.Commands[0].Parameters.Add(Param);
    }
  }
}

আপনি সহজেই কোনও স্ক্রিপ্টে একাধিক পরামিতি যুক্ত করতে পারেন। আমি আরও লক্ষ্য করেছি যে আপনি যদি স্ক্রিপ্টে কোনও ভেরিয়েবলের থেকে কোনও মূল্য পেতে চান তবে:

Object resultcollection = runspace.SessionStateProxy.GetVariable("results");

// ফলাফল ভি এর নাম হচ্ছে

আপনি যেভাবে দেখিয়েছেন সেভাবে আপনাকে এটি করতে হবে কারণ কোনও কারণে যদি আপনি কোসি ২৮০১ এর পরামর্শ অনুসারে এটি করেন তবে স্ক্রিপ্ট ভেরিয়েবলের তালিকাটি আপনার নিজের ভেরিয়েবলের সাথে পূর্ণ হবে না।


3

আমার জন্য, সি # থেকে পাওয়ারশেল স্ক্রিপ্টটি চালানোর সবচেয়ে নমনীয় উপায়টি ব্যবহার করা হয়েছিল PowerShell.Create().AddScript()

কোড স্নিপেট হয়

string scriptDirectory = Path.GetDirectoryName(
    ConfigurationManager.AppSettings["PathToTechOpsTooling"]);

var script =    
    "Set-Location " + scriptDirectory + Environment.NewLine +
    "Import-Module .\\script.psd1" + Environment.NewLine +
    "$data = Import-Csv -Path " + tempCsvFile + " -Encoding UTF8" + 
        Environment.NewLine +
    "New-Registration -server " + dbServer + " -DBName " + dbName + 
       " -Username \"" + user.Username + "\" + -Users $userData";

_powershell = PowerShell.Create().AddScript(script);
_powershell.Invoke<User>();
foreach (var errorRecord in _powershell.Streams.Error)
    Console.WriteLine(errorRecord);

স্ট্রিমগুলি পরীক্ষা করে কোনও ত্রুটি আছে কিনা তা আপনি পরীক্ষা করতে পারেন r সংগ্রহটি চেক করা সত্যিই সহজ ছিল। ব্যবহারকারী হ'ল পাওয়ারশেল স্ক্রিপ্টটি প্রত্যাবর্তনের বস্তুর প্রকার।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.