我有一个非常古老的winform应用程序,用户可以直接使用本地化在网络文件夹中的exe文件。
每次我想要发布新版本时,我的大问题都是。
应用程序的dll被用户锁定,我收到以下错误:
该进程无法访问该文件,因为该文件正被另一个文件使用 过程
(我使用其他应用发布新版本)。
我想创建一个强制删除文件的脚本,即使某些用户仍在使用该应用程序。
我不介意用什么语言写,我试过PowerShell,C#,但没有找到答案。
答案 0 :(得分:0)
假设因为在您的问题中,您正在询问如何强制删除部署的程序集,这将使正在使用的应用程序意外关闭,然后...
尝试在部署之前首先杀死exe的进程。例如在c#中(未经测试/未优化,直到我有一个免费的秒,所以只是初步想法):
while(Process.GetProcessesByName("process_name").Length > 0)
{
//keep murderizing process while they are running
foreach (var process in Process.GetProcessesByName("whatever"))
{
process.Kill();
}
}
//Should be free now to delete
答案 1 :(得分:0)
您好!在远程主机中,您可以尝试这样做:
How-To-Almost-Everything-In-WMI-via-C-Part-Proce
或者像这样(使用powershell - 在C#中添加System.Management.Automation.dll):
using System.Management.Automation;
var xs = PowerShell.Create().AddScript("(gwmi win32_process -ComputerName Host | ? {$_.name -like 'proceesname*'}).Terminate()").AddCommand("out-string");
Collection<PSObject> results = xs.Invoke();
foreach (var str in results)
{
Console.WriteLine(str);
Console.ReadLine();
}
或者您可以使用psexec.exe在远程PC上连接:
string queryString =
"SELECT Name" +
" FROM Win32_Process";
ConnectionOptions connOptions = new ConnectionOptions();
connOptions.Username = "user@domain.local";
connOptions.Password = "password";
SelectQuery query = new SelectQuery(queryString);
ManagementScope scope = new System.Management.ManagementScope(@"\\Hostname\root\CIMV2", connOptions);
ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);
ManagementObjectCollection processes = searcher.Get();
foreach (ManagementObject mo in processes)
{
if (mo["Name"].ToString() == "mmc.exe")
{
Console.WriteLine(mo["Name"].ToString());
Process cmd = new Process();
cmd.StartInfo.FileName = "processname.exe";
cmd.StartInfo.RedirectStandardInput = true;
cmd.StartInfo.UseShellExecute = false;
cmd.Start();
cmd.StandardInput.WriteLine("psexec.exe \\\\Hostname cmd /c taskkill /IM " + mo["Name"].ToString() + " /f" );
cmd.WaitForExit();
Console.ReadKey();
}
}