Windows 从当前目录以管理员身份运行批处理文件(.bat)

Windows 从当前目录以管理员身份运行批处理文件(.bat),windows,batch-file,cmd,administrator,Windows,Batch File,Cmd,Administrator,我目前正在为一所学校编写代码,允许学生在其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 ""

我目前正在为一所学校编写代码,允许学生在其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\u Installer
可以工作,但是
C:\Users\Computer One\Desktop\Auto\u Installer
不能工作,因为计算机和一之间有空格。由于12至18岁的学生将使用它,因此他们无法修复此问题


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

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

@Echo关闭
如果/I不是“%CD%\”==“%~dp0”CD/D“%~dp0”
Echo欢迎来到莫斯曼州立高中附加功能安装程序
超时5/NoBreak>Nul
复制打印映射文件
如果不存在C:\Printing\(
创建打印目录
MD C:\打印
)
复制/Y configuration.xml C:\Printing
复制/Y student\u printers.xml C:\Printing
复制/Y PrintMap2.exe C:\Printing
Echo复制打印机设置文件
复制/Y StudentPrinting.sfx.exe C:\
Echo正在运行连接打印机设置
C:\StudentPrinting.sfx.exe
Echo请完成BYOx和剪纸上的说明,以限制入职。
Echo启动凭据GUI
BYOx.exe
Echo启动剪纸安装程序
client-local-install.exe
回音(
回声结束。按任意键退出。。。
超时-1

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

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

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


非常感谢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

如果您不介意以下问题:为什么在每一行中使用
@command
,而不是在开始时使用
@echo off
?请查找和命令的正确语法。您还将发现浏览将非常有用。为什么不简单地使用
cd/D“%~dp0。”
(如果
,则不使用
)?您可能会争辩说,最终产品没有区别,或者不会显示错误;但我认为这是更好的做法。(如果我的墙壁已经漆成白色,我不想把它们漆成白色)。
@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