gpt4 book ai didi

windows - 使用参数从 PowerShell 启动批处理文件

转载 作者:可可西里 更新时间:2023-11-01 10:36:18 32 4
gpt4 key购买 nike

基于 How can I auto-elevate my batch file, so that it requests from UAC administrator rights if required?我正在尝试制作一个接受命令行(批处理文件名和参数)作为参数的 RunElevated.bat(请参阅下面的代码)。

当目标批处理文件路径中没有空格时,RunElevated.bat 工作正常。但是一旦该路径包含空格,它就会失败:无论我如何引用,PowerShell barfs 或参数都没有从 PowerShell 正确传递到批处理文件。

我试过:

  1. 使用 "" 转义(如 suggested by many sources )
  2. 使用 \" 转义(根据 Escaping quotes in powershell.exe -command via command prompt 的建议)
  3. 添加 --%(根据 PowerShell and external commands done rightEasier Reuse of Command Lines From Cmd.exe 的建议)
  4. ' 包围(如 suggested by CB. )。所以:

    • 我想做的事是否可行?
    • 如果是这样:怎么做?

RunElevated.bat:

:checkParameters
echo [%*]
if [%1]==[] ( goto :help ) else ( goto :checkPrivileges )

:help
echo Syntax:
echo %0 CmdLine
echo Where CmdLine is executed with UAC privileges.
goto :exit

:checkPrivileges
net file 1>nul 2>nul
if '%errorlevel%' == '0' ( goto :gotPrivileges ) else ( goto :getPrivileges )

:getPrivileges
PowerShell "Start-Process -FilePath \"%0\" -Verb RunAs -ArgumentList \"%*\""
goto :exit

:gotPrivileges
%*
pause

:exit
pause
exit /b

echo-cd.bat 我存储在 D:\tools\echo-cd.bat"D:\to ols\echo- cd.bat":

echo Current Directory: [%CD%]
echo Parameters: [%*]
pause

运行良好:

D:\tools\RunElevated.bat D:\tools\echo-cd.bat foo

这些失败了:

D:\tools\RunElevated.bat "D:\to ols\echo-cd.bat"foo

第一个失败发生在 %*:

C:\Windows\system32>D:\to ols\echo-cd.bat foo
'D:\to' is not recognized as an internal or external command,
operable program or batch file.

这是因为 PowerShell 删除了批处理文件名两边的引号:

C:\Windows\system32>echo [D:\to ols\echo-cd.bat foo]
[D:\to ols\echo-cd.bat foo]

我希望 D:\to ols\echo-cd.bat 有双引号,而 foo 没有。

D:\tools\RunElevated.bat\"D:\to ols\echo-cd.bat\"foo

第二次失败发生在 PowerShell 级别:

D:\>PowerShell "Start-Process -FilePath \"D:\tools\RunElevated.bat\" -Verb RunAs -ArgumentList \"\"D:\to ols\echo-cd.bat\" foo\""
Start-Process : Cannot validate argument on parameter 'ArgumentList'. The argument is null or empty. Supply an argument that is not null or empty and then try the command again.
At line:1 char:77
+ Start-Process -FilePath "D:\tools\RunElevated.bat" -Verb RunAs -ArgumentList <<<< ""D:\to ols\echo-cd.bat" foo"

这是因为两次转义将以 ArgumentList 的空字符串结束。

D:\tools\RunElevated.bat --% "D:\to ols\echo-cd.bat"foo

第三次失败也是在%*:

C:\Windows\system32>--% D:\to ols\echo-cd.bat foo
'--%' is not recognized as an internal or external command,
operable program or batch file.

这也是因为 PowerShell 删除了批处理文件名周围的引号:

C:\Windows\system32>echo [--% D:\to ols\echo-cd.bat foo]
[--% D:\to ols\echo-cd.bat foo]

我希望 --% 不存在,D:\to ols\echo-cd.bat 有双引号,foo 不是。

D:\tools\RunElevated.bat '"D:\to ols\echo-cd.bat"' foo

%* 再次失败:

C:\Windows\system32>'D:\to ols\echo-cd.bat' foo
The filename, directory name, or volume label syntax is incorrect.

这是因为 PowerShell 删除了批处理文件名周围的双引号(并保留了单引号):

C:\Windows\system32>echo ['D:\to ols\echo-cd.bat' foo]
['D:\to ols\echo-cd.bat' foo]

C:\Windows\system32>if ['D:\to] == [] (goto :help ) else (goto :checkPrivileges )

最佳答案

我记得为此使用了以下方法:

start "" %systemroot%\System32\windowspowerShell\v1.0\powershell.exe -exec bypass -noprofile -command "&{ start-process powershell -verb RunAs -ArgumentList '-noprofile -exec bypass -file \"c:\temp\test folder\elevatedpowershell.ps1\"'}"

您可以像在此处那样将\"c:\temp\test folder\elevatedpowershell.ps1\"替换为\"$0\"。我还发现来自 Keith Hill 的关于 self 提升 PowerShell 的解决方案在我需要此人成为管理员时非常有用。我现在没有链接,但它是这样的:

function IsAdministrator
{
$Identity = [System.Security.Principal.WindowsIdentity]::GetCurrent()
$Principal = New-Object System.Security.Principal.WindowsPrincipal($Identity)
$Principal.IsInRole([System.Security.Principal.WindowsBuiltInRole]::Administrator)
}


function IsUacEnabled
{
(Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Policies\System).EnableLua -ne 0
}

if (!(IsAdministrator))
{
if (IsUacEnabled)
{
[string[]]$argList = @('-NoProfile', '-File', ('"' + $MyInvocation.MyCommand.Path + '"'))
$argList += $MyInvocation.BoundParameters.GetEnumerator() | Foreach {"-$($_.Key)", "$($_.Value)"}
$argList += $MyInvocation.UnboundArguments
Start-Process "$env:Windir\System32\WindowsPowerShell\v1.0\PowerShell.exe" -Verb Runas -WorkingDirectory $pwd -WindowStyle Hidden -ArgumentList $argList
return
}
else
{
throw "You must be administrator to run this script"
}
}

假设您想要提升 PowerShell 脚本的权限,可以将它放在 PowerShell 脚本的顶部。

关于windows - 使用参数从 PowerShell 启动批处理文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24736482/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com