[英]Windows Service cannot run a bat file properly on Windows XP - C#
我有Windows服务,我希望它能自动更新。 因此,当我的服务了解到有更新时,它将创建一个.bat文件:
File.WriteAllLines(updateFileName, new string[] {"sc stop "+ServiceName,
"ping 10.10.10.10 -n 8", "DEL "+ServicePath,
"RENAME "+NewServicePath+" "+ServicePath, "sc start "+ServiceName})
然后我创建一个流程并启动它,我已经尝试过
Process updateProcess = new Process();
updateProcess.StartInfo.FileName = updateFileName;
updateProcess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
updateProcess.StartInfo.CreateNoWindow = true;
updateProcess.StartInfo.Verb = "runas";
updateProcess.Start();
和这个
var psi = new ProcessStartInfo
{
CreateNoWindow = true,
UseShellExecute = false,
FileName = "cmd.exe",
Arguments = "/C " + updateFileName,
WindowStyle = ProcessWindowStyle.Hidden,
RedirectStandardOutput = true,
RedirectStandardError = true,
Verb = "runas",
ErrorDialog = false
};
updateProcess.StartInfo = psi;
updateProcess.Start();
我还尝试编写一个控制台应用程序updateService.exe,以停止,更新和启动服务。 在这种情况下,我已经使用ServiceDirectory\\updateService.exe
创建了一个.bat文件,并尝试运行它。
我的服务使用LocalSystem
帐户。
以上所有这些东西在Windows 7上都可以正常工作。
但是在Windows XP上它不起作用:
因此,我想知道如何强制我的服务在Windows XP上自行更新,我认为特权存在一些问题,但是我不知道如何处理它们。
首先,我建议从命令提示符窗口中手动运行创建的批处理文件,以查看服务运行时DEL和RENAME命令可能出现的问题。
其次,它没有发布可能在此处很重要的变量NewServicePath
和ServicePath
的值。
我建议进一步使用代替
DEL ServicePath
RENAME NewServicePath ServicePath
批处理代码
MOVE /Y "Name of new file with full path" "Name of file to update with full path"
使用带有参数/Y
MOVE命令覆盖现有文件比使用DEL和RENAME更好,因为RENAME命令要求第二个参数仅是没有路径的文件名。 另外,使用MOVE更新一次后,服务文件就存在。
建议不要对两个文件使用完整路径,因为在创建过程时或在批处理文件中都不会设置用于执行批处理文件的当前目录。
通过使用cd /D "%~dp0"
作为批处理文件的第一行,可以将批处理文件的当前目录设置为该批处理文件的目录。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.