我用c#编写了2个应用程序,用PowerShell 1.0编写了另一个应用程序,在我的代码的某些方面,我想传递一个字符串,指示我的c#app中的服务器名称到我写的powershell脚本文件,我该如何发送?我该如何接受呢?
我的代码:
RunspaceConfiguration runspaceConfiguration = RunspaceConfiguration.Create();
Runspace runspace = RunspaceFactory.CreateRunspace(runspaceConfiguration);
runspace.Open();
RunspaceInvoke scriptInvoker = new RunspaceInvoke(runspace);
Pipeline pipeline = runspace.CreatePipeline();
String scriptfile = @"c:\test.ps1";
Command myCommand = new Command(scriptfile, false);
CommandParameter testParam = new CommandParameter("username", "serverName");
myCommand.Parameters.Add(testParam);
pipeline.Commands.Add(myCommand);
Collection<PSObject> psObjects;
psObjects = pipeline.Invoke();
runspace.Close();
和我的powershell脚本
param([string]$Username)
write-host $username
我错过了什么?我对powershell很新。
答案 0 :(得分:1)
我的机器有PowerShell 2.0和3.0但不是1.0,所以我的结果可能会有所不同。当我在PowerShell 3.0框中运行代码时,我得到:
一个命令,提示用户失败,因为主机程序或 命令类型不支持用户交互。尝试一个主机程序 支持用户交互,例如Windows PowerShell控制台 或Windows PowerShell ISE,并从中删除与提示相关的命令 不支持用户交互的命令类型,例如Windows PowerShell工作流程。
它不喜欢Write-Host,因此我将脚本更改为
param([string]$Username)
Get-Date
Get-ChildItem -Path $userName
获取日期,以便我可以看到一些输出,而不依赖于参数和GCI来使用参数。我将您的代码修改为如下所示:
RunspaceConfiguration runspaceConfiguration = RunspaceConfiguration.Create();
using (var runspace = RunspaceFactory.CreateRunspace(runspaceConfiguration))
{
runspace.Open();
String scriptfile = @"..\..\..\test.ps1";
String path = @"C:\Users\Public\";
var pipeline = runspace.CreatePipeline();
pipeline.Commands.Add(new Command("Set-ExecutionPolicy RemoteSigned -Scope Process", true));
pipeline.Invoke();
pipeline = runspace.CreatePipeline();
var myCommand = new Command(scriptfile, false);
var testParam = new CommandParameter("username", path);
myCommand.Parameters.Add(testParam);
pipeline.Commands.Add(myCommand);
var psObjects = pipeline.Invoke();
foreach (var obj in psObjects)
{
Console.WriteLine(obj.ToString());
}
runspace.Close();
}
Console.WriteLine("Press a key to continue...");
Console.ReadKey(true);
并且在没有错误的情况下运行并在PoSh 2和3上显示文件夹内容。
有关信息,如果您只是为当前进程设置执行策略,则无需运行提升,因此我可以在代码中执行此操作。