我有一个C#代码启动"自定义操作",通常是一个.bat文件,用于在计算机上安装/重新安装Windows服务,但我的应用程序只知道这个自定义操作可以是开始使用Process.Start()。当我的应用程序将文件下载到用户定义的文件夹时触发自定义操作。 这是我的文件夹结构:" new"包含新文件," service"包含用于运行Windows服务的文件。
我的批处理文件如下所示:
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();
这样我的进程无法找到这些文件,因为它不会在目标文件夹中运行。批处理文件必须是这样的,因为它不能包含绝对路径。如何使进程保留在当前目标文件夹中?
答案 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文件的文件夹。
总之,此代码用于返回执行批处理文件的文件夹,并将文件夹保存到堆栈。