以管理员身份启动批处理并留在当前文件夹中
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 到您执行批处理文件的文件夹并将该文件夹保存到堆栈中。
我有一个启动 "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 到您执行批处理文件的文件夹并将该文件夹保存到堆栈中。