“将参数传递给powershell

时间:2017-01-25 16:56:40

标签: c# powershell cmd

我正在尝试将一些参数解析为我在PowerShell中运行的脚本。 但是我在执行脚本时遇到错误,说它们是空的。

我开始这样的过程:

string input1 = "Powershell.exe -File " + Config.Directory + "/ICS.ps1" + " -toggle '" + toggle + "' -par1 '" +
                par1 + "' -par2 '" + par2 + "' -connectionInterface '" + connectionInterface + "'";

//(for readability) input1 will look something like this:
//Powershell.exe -File map/to/ICS.ps1 -toggle 'EnableSharing' -par1 '0' -par2 '1' -connectionInterface 'Ethernet'

string[] output = CmdProcess.Exec(input1);

CmdProcess.Exec是我为快速运行cmd进程而创建的方法。 它像这样工作

public static string[] Exec(params string[] parameters)
    {
        Process cmd = new Process
        {
            StartInfo =
            {
                UseShellExecute = false,
                Verb = "runas",
                FileName = @"cmd.exe",
                RedirectStandardInput = true,
                RedirectStandardOutput = true,
                CreateNoWindow = true,
            }
        };
        cmd.Start();

        foreach (string parameter in parameters)
        {
            cmd.StandardInput.WriteLine(parameter);
        }
        cmd.StandardInput.WriteLine("exit");
        return Regex.Split(cmd.StandardOutput.ReadToEnd(), "\r\n");
    }

我使用cmd执行powershell的原因是因为我尝试使用powershell实例*但是在真正快速的计算机上因为未知原因而崩溃(如果你手动运行它会正常运行)。 * System.Management.Automation.Powershell

我写的脚本中的

:(在脚本的开头)

Param( [string]$toggle, [string]$par1, [string]$par2, [string]$connectionInterface )

但它给出了一个错误,params为null:

You cannot call a method on a null-valued expression.
At C:\Users\Jeremy\AppData\Roaming\HotspotLauncher\ICS.ps1:10 char:1
+ $config.$toggle($par1)
+ ~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull

我和所有参数都有这样的错误。不只是$toggle$par1

<小时/> 我尝试单独运行Powershell.exe-File .....,但这导致我的线程挂起。 此外,我100%肯定togglepar1,其余的(在C#代码中)不是自己为null 我还尝试在脚本[CmdletBinding()]之前添加params,但没有做任何事情:

[CmdletBinding()]Param( [string]$toggle, [string]$par1, [string]$par2, [string]$connectionInterface )

<小时/> 这是powershell脚本:

[CmdletBinding()]Param( [string]$toggle, [string]$par1, [string]$par2, [string]$connectionInterface )

regsvr32 hnetcfg.dll /s
$m = New-Object -ComObject HNetCfg.HNetShare
$m.EnumEveryConnection |% { $m.NetConnectionProps.Invoke($_) }
$c = $m.EnumEveryConnection |? { $m.NetConnectionProps.Invoke($_).Name -eq $connectionInterface }
$config = $m.INetSharingConfigurationForINetConnection.Invoke($c)
Write-Output $config.SharingEnabled
Write-Output $config.SharingConnectionType
$config.$toggle($par1)

$m2 = New-Object -ComObject HNetCfg.HNetShare
$m2.EnumEveryConnection |% { $m2.NetConnectionProps.Invoke($_) }
$c2 = $m2.EnumEveryConnection |? { $m2.NetConnectionProps.Invoke($_).DeviceName -Match 'Microsoft Hosted Network Virtual Adapter' }
$config2 = $m2.INetSharingConfigurationForINetConnection.Invoke($c2)
Write-Output $config2.SharingEnabled
Write-Output $config2.SharingConnectionType
$config2.$toggle($par2)

此脚本启用/禁用$connectionInterface的Internet共享,可能类似于以太网或Wifi,并将其设置为公共($par1)/或者如果必须禁用它,则不需要。 并对microsoft hostednetwork执行相同操作并将其设置为private($par2)。

1 个答案:

答案 0 :(得分:1)

请勿使用powershell.exe分叉新流程 - 请改为使用the API

using System.Collections.ObjectModel;
using System.IO;
using System.Management.Automation;
//...

using(PowerShell ps = PowerShell.Create())
{
    ps.AddScript(Path.Combine(Config.Directory, "ICS.ps1"))
        .AddParameter("toggle", toggle)
        .AddParameter("par1", par1)
        .AddParameter("par2", par2)
        .AddParameter("connectionInterface", connectionInterface);
    Collection<PSObject> results = ps.Invoke();
}

请记住将System.Management.Automation.dll程序集的引用添加到项目中