以管理员身份启动批处理并留在当前文件夹中

Start batch process as administrator and stay in current folder

我有一个启动 "custom action" 的 C# 代码,通常是一个 installs/re-installs 机器上 Windows 服务的 .bat 文件,但我的应用程序只知道这个自定义操作可以使用 Process.Start() 开始。当我的应用程序将文件下载到用户定义的文件夹时,会触发自定义操作。 这是我的文件夹结构:"new" 包含新文件,"service" 包含用于 运行 宁 windows 服务的文件。

我的批处理文件如下所示:

net stop DataExchangeProxyService
installutil /u .\service\DataExchangeProxyService.exe
copy .\new\*.* .\service
installutil .\service\DataExchangeProxyService.exe
net start DataExchangeProxyService
PAUSE

问题是当我使用 "runas" 动词从 C# 启动进程时,当前目录是 "C:\Windows\System32..."

Process process = new Process();
ProcessStartInfo startinfo = new ProcessStartInfo();
startinfo.FileName = Path.Combine(this.destinationFolder, customAction);
startinfo.Verb = "runas";        
process.StartInfo = startinfo;
process.Start();

这样我的进程就找不到这些文件,因为它 运行 不在目标文件夹中。批处理文件必须是这样的,因为它不能包含绝对路径。如何让进程停留在当前目标文件夹?

我想 ProcessStartInfo.WorkingDirectory 可能就是您要找的东西

我没有你所有的源代码,所以我无法为你测试,但我建议你保存执行目录,然后将你的新进程设置在那里执行。 Windows 可能仍会将您带到新用户的默认路径,但您可以调整时间以确保您在正确的时间进入正确的文件夹。像这样:

        string savedDirectory = Directory.GetCurrentDirectory();
        Process process = new Process();
        ProcessStartInfo startinfo = new ProcessStartInfo();
        startinfo.FileName = Path.Combine(this.destinationFolder, customAction);
        startinfo.Verb = "runas";
        startinfo.WorkingDirectory = savedDirectory;
        process.StartInfo = startinfo;
        process.Start();

将此行放在靠近 bat 文件顶部的位置(在引用任何 files/folders 之前)

pushd "%~dp0"

无论 'Run as admin' 与否,这都有效。

另一个解决方案可能是修改批处理文件以定位自身,更改到此文件夹,然后执行剩余的过程

setlocal enableextensions disabledelayedexpansion

    call :reinstall
    pause
    exit /b 

:reinstall
    pushd "%~dp0" && (
        net stop DataExchangeProxyService
        installutil /u .\service\DataExchangeProxyService.exe
        copy .\new\*.* .\service
        installutil .\service\DataExchangeProxyService.exe
        net start DataExchangeProxyService
        popd
    )

其中 %~dp0 是包含批处理文件的文件夹的驱动器和路径。您可以使用此变量更改所有文件引用,以便使用绝对路径,或者按照您的代码更改当前活动目录并使用相对路径

如果你问为什么是子程序,请阅读In Batch file ~dp0 changes on changing directory

因为我还没有回复,因为我已经不是用户那么久了,但你想知道 pushd "%~dp0" 是做什么的; pushd 命令用于转到文件夹,有点像 cd,但也会将该文件夹名称保存到堆栈中。使用 popd,您稍后可以 return 到顶部的堆栈项目。 %~dp0是当前bat文件执行的文件夹。 总之,此代码用于 return 到您执行批处理文件的文件夹并将该文件夹保存到堆栈中。