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

时间:2015-10-23 09:40:50

标签: c# batch-file windows-services

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

enter image description here

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

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

问题是我从C#开始一个过程" runas"动词,那么当前的指南就是" 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();

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

5 个答案:

答案 0 :(得分:1)

将此行放在bat文件顶部附近(在引用任何文件/文件夹之前)

pushd "%~dp0"

无论是否以“以管理员身份运行”,这都将有效。

答案 1 :(得分:0)

我认为ProcessStartInfo.WorkingDirectory可能是您正在寻找的

答案 2 :(得分:0)

我没有您的所有源代码,所以我无法为您测试,但我建议您保存执行目录,然后将新进程设置为在那里执行。 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();

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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