如何从 Windows 命令提示符 (CMD) 运行 长 Powershell 脚本

How to Run Long Powershell script from Windows Command Prompt (CMD)

我试图从命令提示符启动一个名为 "long name here.ps1" 的长 powershell 脚本。但我也在努力确保它 运行s 作为 powershell 中的管理员命令。我在 powershell 中相应地设置了所有执行策略我使用 ss64 set-executionpolicy command guide for powershell to get powershell working. But I am trying to use the solution from another Whosebug question 作为管理员谈论 运行ning 命令。我正在 运行ning 一个需要以管理员身份执行 powershell 脚本 (.ps1) 的批处理脚本,我不介意 UAC 提示用户还是输入密码。我目前正在使用以下命令:

powershell.exe -command "&{ Start-Process powershell -ArgumentList '-noprofile -file "C:\long name here.ps1"' -verb RunAs}"

我在底部的 https://ss64.com/ps/powershell.html 找到了这个命令,其中详细介绍了如何以管理员身份 运行 执行 powershell 命令。该代码的问题在于我的 powershell 脚本 1. 有参数,并且 2. 名称很长。我已经尝试过此命令的许多不同迭代但没有成功,下面列出了不起作用的那些:

powershell.exe -command "&{ Start-Process powershell -ArgumentList '-noprofile -file C:\long` name` here.ps1' -verb RunAs}"

powershell.exe -command "&{ Start-Process powershell -ArgumentList '-noprofile -file:"C:\long name here.ps1' -verb RunAs}"

此外,我完全不知道如何将参数发送到实际脚本。

如果我没看错您的问题 - powershell 不会找到该文件,因为它在遇到空白时会停止读取路径名 space?

给出的示例 here 指定;以管理员身份从命令提示符中 运行 的 powershell 命令应具有以下语法:

powershell.exe -noprofile -command "&{ start-process powershell -ArgumentList '-noprofile -file MyScript.ps1' -verb RunAs}"

有几种方法可以实现您的需求。但最简单的方法是使用 ` 字符转义引号。所以类似于;

powershell.exe -noprofile -command "&{ start-process powershell -ArgumentList '-noprofile -file `"C:\long file name.ps1`"' -verb RunAs}"

也可能值得查看其他答案here

使用免费软件第三方实用程序

如果允许使用免费的第三方可执行文件,您可以使用我编写的名为 elevate32.exe(32 位)和 elevate64.exe(64 位)的简短工具来启动 powershell.exe 作为管理员使用 -File 参数和您要使用的脚本参数:

elevate64 -- powershell.exe -File "<path>\<long script name>.ps1" -Arg "<long script argument>"

您可以从 www.westmesatech.com 获取该工具(受版权保护的免费软件,可在任何地方免费使用,无需安装)。

使用 WSH 脚本

如果您不能使用外部可执行文件,您也可以使用 Windows脚本宿主 (WSH) 脚本,elevate.js:

var args = WScript.Arguments;
if ( args.Length >= 1 ) {
    var exec = args.Item(0);
    var cmdLine = "";
    for (var i = 1; i < WScript.Arguments.Length; i++ ) {
      cmdLine += cmdLine == "" ? '"' + args.Item(i) + '"' : ' "' + args.Item(i) + '"';
    }
    var shellApp = new ActiveXObject("Shell.Application");
    shellApp.ShellExecute(exec, cmdLine, "", "runas");
}

您可以这样调用:

wscript.exe "d:\path\elevate.js" powershell.exe -File "C:\long path\script name.ps1" "long script argument"

自行提升您的 PowerShell 脚本

另一种选择是编写自提升的 PowerShell 脚本。您可以检查脚本中的海拔高度;如果没有提升,它可以自行启动提升和 运行 您需要的任何命令。示例:

$isElevated = ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)

if ( -not $isElevated ) {
  Start-Process powershell.exe "-File",('"{0}"' -f $MyInvocation.MyCommand.Path) -Verb RunAs
  exit
}

& "d:\long path name\script name.ps1" "Long Argument 1" "Long Argument 2"

当您使用 PowerShell.exe -Command 时,您不需要使用引号。例如,您可以 运行 以下内容:

PowerShell.exe -Command Get-Service 'wuauserv'

-Command 之后的所有内容都被解释为命令。另请注意,CMD 中的双引号需要使用反斜杠转义。因此:

powershell.exe -Command Start-Process PowerShell -ArgumentList '-NoProfile -File \"C:\long name here.ps1\"' -Verb RunAs

如果您的文件有参数:

powershell.exe -Command Start-Process PowerShell -ArgumentList '-NoProfile -File \"C:\long name here.ps1\" \"Arg1\" \"Arg2\"' -Verb RunAs