如何从 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
我试图从命令提示符启动一个名为 "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