从Windows命令提示符(CMD)以提升的权限运行PowerShell脚本,路径中包含空格

hmtdttj4  于 2023-10-18  发布在  Shell
关注(0)|答案(3)|浏览(245)

我试图从命令提示符启动一个长的PowerShell脚本,名称为“long name here.ps1”。但我也试图确保它在PowerShell中作为管理员命令运行。我相应地设置了PowerShell中的所有执行策略,并使用了PowerShell的SS64 Set-ExecutionPolicy命令指南来让PowerShell工作。但我试图使用来自another Stack Overflow question的解决方案,该解决方案讨论了以管理员身份运行命令。我正在运行一个批处理脚本,需要以管理员身份执行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.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}"

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

l5tcr1uw

l5tcr1uw1#

使用开源工具

如果允许使用开源实用程序,则可以使用我编写的一个名为elevate.exe的简短工具,以管理员身份使用-File参数和您希望使用的脚本参数启动powershell.exe:用途:

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

你可以在这里获得开源工具:
https://github.com/Bill-Stewart/elevate

使用WSH脚本

如果您无法使用外部可执行文件,也可以使用Windows Script Host(WSH)脚本elevate.js来执行此操作(尽管它不像提升工具的--参数那样可靠地处理引号):

// elevate.js
var args = WScript.Arguments;

if ( (args.Length == 0) || (args.Named.Exists("?")) ) {
  WScript.Echo("Usage: elevate.js command [arg [...]]");
  WScript.Quit();
}

var exec = args.Item(0);
var cmdLine = "";
for ( var i = 1; i < args.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"
tmb3ates

tmb3ates2#

如果我阅读你的问题是正确的- powershell不会找到文件,因为它停止阅读路径名时,它遇到一个空格?
给出的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

wpx232ag

wpx232ag3#

当你使用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

相关问题