【问题标题】:Running a Batch File (.bat) as Administrator from the Current Directory从当前目录以管理员身份运行批处理文件 (.bat)
【发布时间】:2017-11-24 08:13:32
【问题描述】:

我目前正在为一所学校编写代码,允许学生以管理员身份在其 Windows 设备上简单地运行批处理文件,并接收使用网络基础设施所需的程序。

@echo Welcome to the Mossman State High School Additional Features Installer
@pause

@echo Starting the Credentials GUI
@echo Starting PaperCut Installer
@start "" %~dp0BYOx.exe
@start "" %~dp0client-local-install.exe

@echo Creating Printing Directory
@md C:\Printing

@echo Copying Print Mapping Files
@copy "" %~dp0configuration.xml C:\Printing /E /W
@copy "" %~dp0student_printers.xml C:\Printing /E /W
@copy "" %~dp0PrintMap2.exe C:\Printing /E /W

@copy "" %~dp0StudentPrinting.sfx.exe C:\ /E /W

@echo Running Connect Printer Setup
@start "C:\" StudentPrinting.sfx.exe

@echo Please complete the instructions on BYOx and PaperCut to finilize 
onboarding.
@pause

由于StudentPrinting.sfx.exe程序之前的编写方式,需要从C:\目录运行,所以需要以管理员身份运行。

我最初发现%~dp0 参数有效,但是一旦进行了进一步的测试,我发现它一旦击中带有空格的计算机名称就会失败,例如。 C:\Users\ComputerOne\Desktop\Auto_Installer 有效,但 C:\Users\Computer One\Desktop\Auto_Installer 不是由于计算机和 One 之间的空间。由于它将由 12 至 18 岁的学生使用,因此他们无法解决此问题。

有没有办法让批处理文件以管理员身份运行,但仍从它所在的目录运行?

【问题讨论】:

  • 如果您不介意这个问题:为什么在每一行都使用@command 而不是在开头使用@echo off
  • 请查看STARTCOPY 命令的正确语法。您还会发现浏览SS64's CMD.EXE reference 会非常有用。

标签: windows batch-file cmd administrator


【解决方案1】:

我会首先确保您的当前目录与脚本的目录匹配。 (这样就不需要前缀 %~dp0)。您需要使用Start 并且您的Copy 命令似乎使用错误的语法和不正确的选项似乎也没有充分的理由。

@Echo Off

If /I Not "%CD%\"=="%~dp0" CD /D "%~dp0"

Echo Welcome to the Mossman State High School Additional Features Installer
Timeout 5 /NoBreak>Nul

Echo Copying Print Mapping Files
If Not Exist C:\Printing\ (
    Echo Creating Printing Directory
    MD C:\Printing
)
Copy /Y configuration.xml C:\Printing
Copy /Y student_printers.xml C:\Printing
Copy /Y PrintMap2.exe C:\Printing

Echo Copying printer Setup Files
Copy /Y StudentPrinting.sfx.exe C:\

Echo Running Connect Printer Setup
C:\StudentPrinting.sfx.exe

Echo Please complete the instructions on BYOx and PaperCut to finilize onboarding.

Echo Starting the Credentials GUI
BYOx.exe

Echo Starting PaperCut Installer
client-local-install.exe

Echo(
Echo Finished. Press any key to exit...
Timeout -1

我已将顺序更改为看起来更有意义的顺序,如果在运行其他两个可执行文件之前无法运行打印机设置,请进行相应调整。

【讨论】:

  • 为什么不直接使用cd /D "%~dp0."(没有if)?
  • 您可能会争辩说最终产品没有区别,或者不会显示错误;但是我认为这是更好的做法。 (如果我的墙壁已经漆成白色,我不想把它们漆成白色).
【解决方案2】:

好的,据我了解,这是正确的解决方案: 第一个代码块检查 admin 并提示您接受如果您不是,或者如果您已经是,它会运行命令 AS ADMIN。 然后 PUSHD %~dp0 确保您在 .bat 所在的当前目录中工作(在您的情况下为 C:\) 然后,如果它与 .bat 文件位于同一目录中,则您可以只使用程序名称! (无需指定路径)

将此保存为 .bat 并尝试根据需要使用您的代码对其进行调整(注意我指定您将代码放在后面的行):

@echo off&cls
REM  --> CHECKING FOR ADMIN
    IF "%PROCESSOR_ARCHITECTURE%" EQU "amd64" (
>nul 2>&1 "%SYSTEMROOT%\SysWOW64\cacls.exe" "%SYSTEMROOT%\SysWOW64\config\system"
) ELSE (
>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 "cmd.exe", "/c ""%~s0"" %params%", "", "runas", 1 >> "%temp%\getadmin.vbs"

    "%temp%\getadmin.vbs"
    del "%temp%\getadmin.vbs"
    exit /B

:gotAdmin
    pushd "%CD%"
    CD /D "%~dp0"
REM -----------------PUT YOUR COMMANDS BELOW THIS LINE-------------------
CLS
PUSHD %~dp0
echo %CD%
echo.
echo HELLO!
echo.
pause

【讨论】:

    【解决方案3】:

    非常感谢 Compo 和 Raphael 协助编程。我已经在虚拟机上测试了该程序,它按预期工作。

    完成的代码如下;

    @echo off&cls
        IF "%PROCESSOR_ARCHITECTURE%" EQU "amd64" (
    >nul 2>&1 "%SYSTEMROOT%\SysWOW64\cacls.exe" 
    "%SYSTEMROOT%\SysWOW64\config\system"
    ) ELSE (
    >nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" 
    "%SYSTEMROOT%\system32\config\system"
    )
    
    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 "cmd.exe", "/c ""%~s0"" %params%", "", "runas", 1 
    >> "%temp%\getadmin.vbs"
    
        "%temp%\getadmin.vbs"
        del "%temp%\getadmin.vbs"
        exit /B
    
    :gotAdmin
        pushd "%CD%"
        CD /D "%~dp0"
    
    If /I Not "%CD%\"=="%~dp0" CD /D "%~dp0"
    
    echo Welcome to the Mossman State High School Additional Features Installer
    timeout 1 /NoBreak>Nul
    
    echo Copying Print Mapping Files
    if not exist C:\Printing\ (
        echo Creating Printing Directory
        md C:\Printing
    )
    copy /Y configuration.xml C:\Printing
    copy /Y student_printers.xml C:\Printing
    copy /Y PrintMap2.exe C:\Printing
    
    echo Copying Printer Setup Files
    copy /Y StudentPrinting.sfx.exe C:\
    
    echo Running Connect Printer Setup
    C:\StudentPrinting.sfx.exe
    
    echo Please complete the instructions on BYOx and PaperCut to finilize 
    onboarding.
    
    echo Starting the Credentials GUI
    start BYOx.exe
    
    echo Starting PaperCut Installer
    start client-local-install.exe
    
    echo(
    echo Finished. Press any key to exit...
    timeout -1
    

    【讨论】:

      猜你喜欢
      • 2016-10-06
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      • 2010-10-14
      • 1970-01-01
      • 2015-10-15
      相关资源
      最近更新 更多