我在批处理脚本中请求管理员:
: BatchGotAdmin
REM --> Check for permissions
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"
REM --> If error flag set, we do not have admin.
if '%errorlevel%' NEQ '0' (
echo Requesting administrative privileges...
goto UACPrompt
) else ( goto gotAdmin )
:UACPrompt
echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
set params = %*:"=""
echo UAC.ShellExecute "%~s0", "%params%", "", "runas", 1 >> "%temp%\getadmin.vbs"
"%temp%\getadmin.vbs"
exit /B
:gotAdmin
if exist "%temp%\getadmin.vbs" ( del "%temp%\getadmin.vbs" )
pushd "%CD%"
CD /D "%~dp0"
将输出传递给日志文件时 - 脚本中的这一点将其切断。有没有办法改变脚本以产生相同的效果(在批处理脚本中间请求UAC管理员权限),同时仍保持日志文件按预期运行?
答案 0 :(得分:0)
我关注序列
set params = %*:"=""
echo UAC.ShellExecute "%~s0", "%params%", "", "runas", 1 >> "%temp%\getadmin.vbs"
应该做的是将环境变量“params [space]”设置为值 [space]command-parameters supplied
:“=”“
在下一行中,您正在使用可能未设置的环境变量“params”。因此,我不确定getadmin.vbs
是否正确生成。
SET
任何一边的空格都很重要......
答案 1 :(得分:0)
我的方法是检查shell脚本中的高程,如果没有提升则失败; e.g。
@echo off
setlocal enableextensions
isadmin -q
if %ERRORLEVEL% NEQ 1 goto :ERROR
...
[do stuff requiring elevation]
....
goto :DONE
:ERROR
echo You must run this script from an elevated command window.
:DONE
endlocal
您可以从此处获取isadmin.exe:Windows Admin Script Tools
比尔
答案 2 :(得分:0)
我知道这个问题已经有8个月了,但是因为你似乎没有得到一个好的答案,我认为无论如何我都会插手,因为我正在寻找其他东西。
我同意Magoo,因为我也不确定set params
行是否正在做你想要的。我建议尝试这样做:
在您的UAC开始时:
:UACPrompt
if '%1'=='UACdone' (shift & goto gotAdmin)
然后在您的原始行之后:
echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
echo UAC.ShellExecute "%~0", "UACdone", "", "runas", 1 >> "%temp%\getadmin.vbs"
为了清楚起见,应该使整个脚本看起来如此:
: BatchGotAdmin
REM --> Check for permissions
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"
REM --> If error flag set, we do not have admin.
if '%errorlevel%' NEQ '0' (
echo Requesting administrative privileges...
goto UACPrompt
) else ( goto gotAdmin )
:UACPrompt
if '%1'=='UACdone' (shift & goto gotAdmin)
echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
echo UAC.ShellExecute "%~0", "UACdone", "", "runas", 1 >> "%temp%\getadmin.vbs"
"%temp%\getadmin.vbs"
exit /B
:gotAdmin
if exist "%temp%\getadmin.vbs" ( del "%temp%\getadmin.vbs" )
pushd "%CD%"
CD /D "%~dp0"
将它放在脚本的顶部,如果您没有管理员权限,它应该生成另一个请求管理员权限的实例。您需要做的就是将命令放在下面。这样做的另一个好处是不需要您随脚本重新分发任何其他工具。