运行 从当前目录以管理员身份创建批处理文件 (.bat)
Running a Batch File (.bat) as Administrator from the Current Directory
我目前正在为一所学校编写代码,允许学生以管理员身份在他们的 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
参数有效,但是一旦进行了进一步测试,我发现一旦点击其中包含 Space 的计算机名称,它就会失败,例如。 C:\Users\ComputerOne\Desktop\Auto_Installer
有效,但 C:\Users\Computer One\Desktop\Auto_Installer
无效,因为 Computer 和 One 之间存在 space。因为12-18岁的学生都会用到,所以没办法解决。
有没有办法让批处理文件 运行 成为管理员,但仍然 运行 来自它所在的目录?
我会首先确保您的当前目录与脚本的目录匹配。 (这样就不需要前缀 %~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
我已将顺序更改为看起来更有意义的顺序,如果在其他两个可执行文件 运行 之前打印机设置不能 运行 那么请相应调整。
好的,据我了解这是正确的解决方案:
第一个代码块检查管理员并提示您接受,如果您不是,或者如果您已经是,它将以管理员身份运行命令。
然后 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
非常感谢 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
我目前正在为一所学校编写代码,允许学生以管理员身份在他们的 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
参数有效,但是一旦进行了进一步测试,我发现一旦点击其中包含 Space 的计算机名称,它就会失败,例如。 C:\Users\ComputerOne\Desktop\Auto_Installer
有效,但 C:\Users\Computer One\Desktop\Auto_Installer
无效,因为 Computer 和 One 之间存在 space。因为12-18岁的学生都会用到,所以没办法解决。
有没有办法让批处理文件 运行 成为管理员,但仍然 运行 来自它所在的目录?
我会首先确保您的当前目录与脚本的目录匹配。 (这样就不需要前缀 %~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
我已将顺序更改为看起来更有意义的顺序,如果在其他两个可执行文件 运行 之前打印机设置不能 运行 那么请相应调整。
好的,据我了解这是正确的解决方案: 第一个代码块检查管理员并提示您接受,如果您不是,或者如果您已经是,它将以管理员身份运行命令。 然后 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
非常感谢 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