从C#代码运行powershell脚本时,无法识别Start-Process

时间:2017-12-23 22:04:26

标签: c# powershell iis asp.net-core-2.0

我有以下代码通过执行Powershell脚本停止IIS应用程序池:

        using (PowerShell ps = PowerShell.Create())
        {
            ps.AddScript("Set-ExecutionPolicy -Scope LocalMachine Unrestricted");
            string stopCommand = File.ReadAllText($"{scriptPath}StopIISPool.ps1");                
            ps.AddScript(stopCommand);
            ps.AddScript($"StopIISAppPool -StopScriptPath {scriptPath}IISStopCommand.ps1 -poolName {paths.IISAppPoolName}");
            ps.Invoke();

            Collection<ErrorRecord> errors = ps.Streams.Error.ReadAll();
        }

这里的StopIISPool.ps1包含以下powershell脚本:

    function StopIISAppPool
    {
        Param(
        [parameter(Mandatory=$true)]
        [string]$stopScriptPath,
        [parameter(Mandatory=$true)]
        [string]$poolName
        )
        process
        {
            PowerShell.exe -NoProfile -ExecutionPolicy Unrestricted -Command "&  {Start-Process PowerShell -windowstyle hidden -ArgumentList '-NoProfile -ExecutionPolicy Unrestricted -noexit -File $stopScriptPath -poolName $poolname' -Verb RunAs}";
        }
   }

此处stopScriptPath是以下命令的路径,该命令仅在提升权限的情况下执行且无错误:

    Param(
        [parameter(Mandatory=$true)]
        [string]$poolName
    )
    Stop-WebAppPool -Name $poolName;

上述C#代码在ASP.NET Core应用程序中运行。 当我在Windows Server 2012 R2上的IIS下部署应用程序并运行时,我在ps.Invoke()行上收到以下错误:

启动进程无法识别为cmdlet,函数,脚本文件或可运行程序的名称。

有人可以解释为什么我会收到这个错误吗?

1 个答案:

答案 0 :(得分:1)

我已经解决了这个问题。实际上我找到了一个解决方法。为了操作IIS应用程序池,我切换到Windows命令行而不是PowerShell。 我使用了以下命令:

<div class="col-xs-4">
<button type="button" class="pull-right btn btn-sm btn-default"><i class="icon-budicon-175"></i></button>
<button type="button" class="pull-right btn btn-sm btn-default"><i class="icon-budicon-176"></i></button>
</div>