Вызвать файл сценария PowerShell с параметрами на C#

#c# #powershell

#c# #powershell

Вопрос:

Действительно борюсь с этим. Я пробовал разные способы, но, похоже, ничего не работает.

-используя addScript: я получаю сообщение об ошибке, сообщающее мне, что я не могу вызывать параметры таким образом, и должен ли использовать пользовательский интерфейс, подобный ISE ?!

-используя параметр FilePath, я не могу найти правильный способ передачи аргументов (проблема с привязкой)

Это последняя версия, которую я пробовал, и она не вызывает ошибок, но сценарий не выполняется, ничего не происходит…

Помощь была бы очень признательна.

 runspace = RunspaceFactory.CreateRunspace();
runspace.Open();
pipeline = runspace.CreatePipeline();

string script =
@"{param($merchantName, $appType, $gruntDirectory, $merchantInstanceDirectory, $editorConnectionString) " 
_config.MerchantInstance.Directory   @"Generate_And_Compile_LESS.ps1"
  " –merchantName $merchantName"
  " –appType $appType"
  " –gruntDirectory $gruntDirectory"
  " -merchantInstanceDirectory $merchantInstanceDirectory"
  " -editorConnectionString $editorConnectionString }";

Command compileCommand = new Command("Invoke-Command");
compileCommand.Parameters.Add("Scriptblock", ScriptBlock.Create(script));

var args = new List<string>();
args.Add(merchantName);
args.Add(appType.GetHashCode().ToString());
args.Add("'"   _config.Grunt.Directory   "'");
args.Add("'"   _config.MerchantInstance.Directory   "'");
args.Add("'"   _connectionStrings.AppConnectionString   "'");

compileCommand.Parameters.Add("ArgumentList", String.Join(",", args));

pipeline.Commands.Add(compileCommand);
Collection<PSObject> results = pipeline.Invoke();
  

Ответ №1:

Вы можете использовать этот код, который я лично только что протестировал.

 static void Main(string[] args)
{
    PowerShell ps = PowerShell.Create();
    ps.AddScript(@"c:testtest.ps1").AddParameter("param1", "paramvalue1");
    ps.Invoke();
}
  

Вот мой тестовый скрипт, расположенный в c:testtest.ps1 .

 [CmdletBinding()]
param (
    [string] $param1
)
Set-Content -Path $PSScriptRoottest.txt -Value $param1;
  

К вашему СВЕДЕНИЮ, убедитесь, что вы запускаете 32-разрядную версию (x86) PowerShell, и установите политику выполнения неограниченной. Visual Studio является 32-разрядным процессом и по умолчанию вызывает 32-разрядный движок PowerShell.

Комментарии:

1. Забыл упомянуть, я хочу использовать объект pipeline, чтобы я мог перехватывать конкретные ошибки, которые выдаются внутри скрипта.

2. ps = ps.AddScript(…).AddParameter(….) работал лучше для меня