Batch file Can窗口';s ShellExecute函数是否接受WSF脚本参数?

Batch file Can窗口';s ShellExecute函数是否接受WSF脚本参数?,batch-file,shellexecute,hybrid,wsh,Batch File,Shellexecute,Hybrid,Wsh,下面的批处理混合脚本旨在在运行某些需要提升权限的任务之前自动调用管理员权限。它会弹出UAC提示,但不管用户选择什么,都不会授予管理员权限 我想知道窗口中使用的函数是否可以接受WSF参数或其他可扩展参数?在本例中,它是批处理文件名。如果可以的话,脚本应该如何进行更改,而不需要使用不同的方法进行重组 <!-- : Begin batch script @echo off setlocal EnableExtensions EnableDelayedExpansion CD /D "%~dp0"

下面的批处理混合脚本旨在在运行某些需要提升权限的任务之前自动调用管理员权限。它会弹出UAC提示,但不管用户选择什么,都不会授予管理员权限

我想知道窗口中使用的函数是否可以接受WSF参数或其他可扩展参数?在本例中,它是批处理文件名。如果可以的话,脚本应该如何进行更改,而不需要使用不同的方法进行重组

<!-- : Begin batch script
@echo off
setlocal EnableExtensions EnableDelayedExpansion
CD /D "%~dp0" & echo "%*"
set "dir=%temp%\Unzip"
set "file=%USERPROFILE%\Downloads\archive.zip"
if not "%1"=="ADR" (call :GetAdminRights
    if defined adm cscript //nologo "%~f0?.wsf" //job:ADM "%~nx0")
>nul 2>&1 net file && (echo/ & echo "!errorlevel!") || ^
(echo/ & echo "!errorlevel!" & goto :end)

:: add your code here
echo Performing admin tasks
echo Hello >C:\test.txt

:end
timeout 5
exit /b

:GetAdminRights
REM Check for permissions
>nul 2>&1 net file
REM If error flag set, user don't have admin permissions
if '!errorlevel!' NEQ '0' (echo Requesting administrative privileges...
    set "adm=0"
    echo/ & echo "!errorlevel!" "%~nx0" "%~dp0" & echo/)
exit /b

----- Begin wsf script --->
<package>
    <job id="ADM"><script language="VBScript">
        Set UAC = CreateObject("Shell.Application") 
        WScript.Echo wscript.Arguments(0)
        UAC.ShellExecute "cmd.exe", "/c ""wscript.Arguments(0)"" ADR", "", "runas", 1 
    </script></job>
</package>  

:: Error in UAC Prompt (shown in details. Can't expand batch name correctly.)
Program location: "C:\Windows\System32\cmd.exe /c "wscript.Arguments(0)" ADR

设置UAC=CreateObject(“Shell.Application”)
WScript.Echo WScript.Arguments(0)
UAC.ShellExecute“cmd.exe”、“/c”wscript.Arguments(0)、“ADR”、“”和“runas”,1
::UAC提示错误(详细信息中显示。无法正确展开批次名称。)
程序位置:“C:\Windows\System32\cmd.exe/C”wscript.Arguments(0)“ADR

是的,它可以。诀窍是在cscript中提交在管理员模式下重新启动Cmd所需的所有Cmd.exe参数,并在批处理的WSF部分正确读取它们

<!-- : Begin batch script
@echo off
setlocal EnableExtensions EnableDelayedExpansion
CD /D "%~dp0" & echo "%*"
set "dir=%temp%\Unzip" & set "file=%USERPROFILE%\Downloads\archive.zip"
if not "%1"=="ADR" (call :GetAdminRights
    if defined adm cscript //nologo "%~f0?.wsf" //job:ADM "/c" "%~sf0" "ADR" )
echo/ & >nul 2>&1 net file && (echo "!errorlevel!" Got admin rights & echo/) ^
 || (echo "!errorlevel!" No admin rights & goto :end)

:: add your code here
echo Performing admin tasks
echo Hello >C:\tst.txt

:end
timeout /t 5 >nul
exit /b

:GetAdminRights
REM Check for permissions
echo/ & >nul 2>&1 net session && (echo Got admin rights) ^
 || (echo No admin rights) & echo/
REM If error flag set, user don't have admin permissions
if '!errorlevel!' NEQ '0' (echo Requesting admin rights...
    set "adm=0" & echo/ & echo "!errorlevel!" "%~nx0" "%~dp0" & echo/)
exit /b

----- Begin wsf script --->
<package>
    <job id="ADM"><script language="VBScript">
        Set UAC = CreateObject("Shell.Application") 
        args = "" 
        For Each strArg in WScript.Arguments
        args = args & strArg & " "  
        Next 
        WScript.Echo args
        UAC.ShellExecute "cmd.exe", args, "", "runas", 1 
    </script></job>
</package>  

设置UAC=CreateObject(“Shell.Application”)
args=“”
对于WScript.Arguments中的每个strArg
args=args&strArg&“
下一个
WScript.Echo参数
UAC.ShellExecute“cmd.exe”,args,,“runas”,1

这是一个批处理脚本'Elevate.bat',以管理员身份执行在参数字符串中传递的任何命令。 如果命令包含特殊字符,则通过“^”对其进行转义。 例如:

Elevate whoami /groups ^| find "S-1-16-12288"`
www.bat:

    <!-- : --- Self-Elevating Batch Script ---------------------------
    @whoami /groups | find "S-1-16-12288" > nul && goto :admin
    @set "ELEVATE_CMDLINE=cd /d "%cd%" & call "%~f0" %*"
    @cscript //nologo "%~f0?.wsf" //job:Elevate & exit /b

    -->
    <job id="Elevate"><script language="VBScript">
      Set objShell = CreateObject("Shell.Application")
      Set objWshShell = WScript.CreateObject("WScript.Shell")
      Set objWshProcessEnv = objWshShell.Environment("PROCESS")
      strCommandLine = Trim(objWshProcessEnv("ELEVATE_CMDLINE"))
      objShell.ShellExecute "cmd", "/c " & strCommandLine, "", "runas"
    </script></job>
    :admin -----------------------------------------------------------

    @echo off
    echo Running as elevated user.
    echo Script file : %~f0
    echo Arguments   : %*
    echo Working dir : %cd%
    echo.
    :: administrator commands here
    :: e.g., run shell as admin
    %*
    pause

为什么您的脚本需要管理员权限?@Bill_Stewart我编辑了这个问题,以给出此类要求的示例。但是,我更感兴趣的是了解ShellExecute限制,而不是找到“任何”可能的方法来完成任务。:)我不明白您在哪里说为什么需要管理员权限。您只是说“在运行某些用户任务之前。“什么任务?(用户任务不应要求管理员权限。)@Bill_Stewart我编辑了文本。IMO中的管理任务示例对我的问题并不重要,但我在代码中给出了一个示例,如将文件保存到C:drive。现在您是否能够直接回答有关ShellExecute函数限制的问题:)我建议不要使用batch/WSF,而是使用PowerShell。
Elevate.bat mklink /d common g:\PerforceData\devel\common
Elevate.bat mklink build.xml g:\PerforceData\devel\build.xml