以管理员身份运行Powershell命令 - 命令本身无法加载

3
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Diagnostics;


namespace WindowsFormsApplication
{
    public partial class Form1 : Form
    {

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            var newProcessInfo = new System.Diagnostics.ProcessStartInfo();
            newProcessInfo.FileName = @"C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe";
            newProcessInfo.Verb = "runas";
            System.Diagnostics.Process.Start(newProcessInfo);
            newProcessInfo.Arguments = @"sfc /scannow";
        }
    }
}

所以我的代码可以运行到一定程度。点击Windows窗体应用程序按钮后,它将以管理员身份在64位的Windows Powershell中运行,但是不会运行一个.ps1脚本“c:\path\script.ps1”或者像上面那样直接写出的命令“sfc /scannow”。
我读到过如果代码开头没有加载"Set-ExecutionPolicy Unrestricted",有时PowerShell命令无法正常工作。
请帮忙!我已经到处寻找答案了。

[...]\SysWOW64\[...]\powershell.exe32 位 PowerShell。 - Mathias R. Jessen
为什么不在没有 PowerShell 的情况下运行该命令? - Daniel A. White
这只是一个例子。 我实际上会使用一些 Powershell 命令进行编程。 如果这个不正确,那么哪个文件夹是 64 位 powershell。SysWOW64 应该包含所有的 64 位 Windows 系统版本。 - DDJ
@SDJ 你搞反了。WOW64代表的是在Win64上的Windows 32位 - 当32位映像访问路径为C:\Windows\System32\*的文件时,文件系统重定向器会检查SysWOW64中是否存在相应的32位映像并重定向调用。因此,在64位Windows上:System32 = 64位映像,SysWOW64 = 32位映像。 - Mathias R. Jessen
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - DDJ
1个回答

1

首先,在启动进程之前,您需要指定Arguments属性:

var newProcessInfo = new System.Diagnostics.ProcessStartInfo();
newProcessInfo.FileName = @"C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe";
newProcessInfo.Verb = "runas";
newProcessInfo.Arguments = @"sfc /scannow";
System.Diagnostics.Process.Start(newProcessInfo);

其次,您需要告诉PowerShell sfc /scannow 是一个命令,而不是命令行开关。
在命令行中,您可以执行powershell.exe -Command "sfc /scannow",因此在您的情况下,正确的Arguments值将是:
newProcessInfo.Arguments = @"-Command ""sfc /scannow""";

"

("" 是在直接字符串字面量中表示 " 的转义序列)

对于 .ps1 文件,请使用 -File 开关:

"
newProcessInfo.Arguments = @"-File ""C:\my\script.ps1""";

如果您不知道目标系统上的执行策略,您可以使用-ExecutionPolicy Bypass绕过它,而不会影响机器范围内的策略。
newProcessInfo.Arguments = @"–ExecutionPolicy Bypass -File ""C:\my\script.ps1""";

谢谢你所提供的所有知识!这对我非常有帮助。 :) - DDJ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接