我已经分别找到了这两项任务的答案,但没有找到答案:
从批处理文件中以管理员身份运行PowerShell
从批处理文件中运行带参数的PowerShell
但我想从批处理文件中以管理员 AND 使用参数运行PowerShell 。
出于这个原因,我确信到目前为止还没有重复。
由于这个原因,这个问题很复杂:
我在运行提升的PowerShell时使用ArgumentList
开关指向文件路径。我也用它来传递参数。另外,我已成功使用此开关。看起来好像我可以将它用于这两个任务。
以下是我目前使用PowerShell的方式:
作为管理员:
powershell -Command "& {Start-Process powershell -ArgumentList '-File "filePath.ps1' -Verb RunAs}"
带参数:
powershell -ExecutionPolicy unrestricted Import-Module "filePath.ps1" -ArgumentList "arg1","arg2"
我尝试过的事情:
我尝试将我的参数添加到传入文件的ArgumentList
,但它们无法识别。
我也尝试将-Verb RunAs
添加到工作参数行,但PowerShell认为我试图传递另一个名为Verb的参数,并且无法以管理员身份运行PowerShell。
是否有可能以管理员身份运行PowerShell,并通过参数,通过切换我传递参数的方式,或者我如何提升PowerShell来实现?
答案 0 :(得分:5)
可以在没有第三方工具的情况下解决您的问题,但解决方案有些神秘。
因此,请考虑下载Bill Stewart的有用的elevate32
和elevate64
工具,如his answer中所述,这简化了解决方案。 < / p>
这是一个简单的示例,它在从cmd.exe
(或批处理文件)启动的提升的PowerShell会话中调用带有参数的Get-Date
cmdlet:
powershell -command "Start-Process -verb runas powershell" "'-noexit -command get-date -UFormat %s'"
注意如何将命令行传递给中间-command
参数创建的提升 PowerShell会话,并将其作为单个参数传递嵌入式单引号。
引用可能会变得棘手,但这种方法原则上也适用于调用*.ps1
文件:
powershell -command "Start-Process -verb runas powershell"
是命令行的不变部分。
剩余的"..."
- 附加字符串必须包含嵌套单个字符串,其中包含PowerShell识别的引号(单引号最简单),其中包含所有参数您将直接传递给powershell ...
命令行调用。
应用于您的示例:
... "'-File C:\path\to\filePath.ps1 arg1 arg2'"
注意:请务必使用完整路径到您的脚本文件,因为提升的PowerShell会话不(必然)运行与调用会话相同的目录。
如果您需要引用嵌套字符串中的参数,请使用\"
:
... "'-File \"c:\path with spaces\to\filePath.ps1\" arg1 arg2'"
答案 1 :(得分:4)
您可以通过获取我编写的名为Elevate32.exe的简短命令行可执行文件(或64位版本的Elevate64.exe)来执行此操作。你可以在这里得到它:
http://www.westmesatech.com/misctools.html(ElevationToolkit1.zip)
示例:
elevate64 -- powershell.exe -file C:\scripts\myscriptfile.ps1
--
之后的所有内容都是您想要提升的命令行。
答案 2 :(得分:0)
如果您恰好拥有着名的NirCmd NirSoft,那么您的服务中有一个很好的elevate
命令(以及更多的命令)。
nircmd elevate powershell.exe -File script.ps1 arg1 arg2 ...
NirCmd 提供x86和x64版本的免费版本,与 NirSoft 中的所有软件一样免费。
答案 3 :(得分:0)
Mi解决了一个自我提升的脚本。如果未使用管理员权限执行。该脚本检查管理员角色并以管理员身份执行。
从浴文件(* .bat)运行Script.ps1
Powershell Core
pwsh.exe -NoLogo -ExecutionPolicy Bypass -Command "./Script.ps1 -Param1 Hello -Param2 World"
pwsh.exe -NoLogo -ExecutionPolicy Bypass -Command "path-to-script/Script.ps1 -Param1 Hello -Param2 World"
Powershell
powershell.exe -NoLogo -ExecutionPolicy Bypass -Command "./Script.ps1 -Param1 Hello -Param2 World"
powershell.exe -NoLogo -ExecutionPolicy Bypass -Command "path-to-script/Script.ps1 -Param1 Hello -Param2 World"
Script.ps1代码
param(
[Parameter(Mandatory=$True, Position=0, ValueFromPipeline=$false)]
[System.String]
$Param1,
[Parameter(Mandatory=$True, Position=1, ValueFromPipeline=$false)]
[System.String]
$Param2
)
if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator))
{
Start-Process pwsh "-NoLogo -ExecutionPolicy Bypass -Command $PSCommandPath -Param1 $Param1 -Param2 $Param2" -Verb RunAs; # //Run this script as Administrator.
exit # //Exit from this non elevated context.
}
# // Executed in elevated Mode
Write-Host $Param1
Write-Host $Param2