直到最近,我们一直在部署.exe应用程序,只需将它们手动复制到服务器上的目标文件夹即可。但是,通常,文件在部署时已经运行(文件是从SQL Server作业调用的) - 有时甚至是多个实例。我们不希望在它运行的过程中终止这个过程。我们也不能等待它完成,因为它一直被调用,有时多次同时被调用。
作为一种解决方法,我们所做的就是剪切和粘贴"通过Windows资源管理器将.exe文件转换为另一个文件夹。显然,它的作用是移动文件(实际上是删除)但将其保存在RAM中,以便正在使用它的进程可以继续而不会出现问题。然后我们将新文件放在那里,当任何后来的程序调用它时会被调用。
我们现在已转向自动部署工具,我们需要一种自动执行此操作的方式。
Stop-Process -name SomeProcess
PowerShell中的会杀死我不想做的过程。
有办法做到这一点吗? (C#也没关系。)
谢谢,
答案 0 :(得分:2)
function moverunningprocess($process,$path)
{
if($path.substring($path.length-1,1) -eq "\") {$path=$path.substring(0,$path.length-1)}
$fullpath=$path+"\"+$process
$movetopath=$path + "--Backups\$(get-date -f MM-dd-yyyy_HH_mm_ss)"
$moveprocess=$false
$runningprocess=Get-WmiObject Win32_Process -Filter "name = '$process'" | select CommandLine
foreach ($tp in $runningprocess)
{
if ($tp.commandline -ne $null){
$p=$tp.commandline.replace('"','').trim()
if ($p -eq $fullpath) {$moveprocess=$true}
}
}
if ($moveprocess -eq $true)
{
New-Item -ItemType Directory -Force -Path $movetopath
Move-Item -path "$path\*.*" -destination "$movetopath\"
}
}
moverunningprocess "processname.exe" "D:\Programs\ServiceFolder"
答案 1 :(得分:1)
因为您正在使用SQL Sever来调用EXE。为什么要添加一个包含最新版本文件路径的表,并修改激活EXE的代码。这样,当推出新版本时,您可以创建一个新文件夹,将文件放入其中,并更新指向它的表。这将允许任何仍然活动的线程访问旧版本,并且任何新线程将获取新的可执行文件。然后,您可以在不再需要之后删除旧文件。