Powershell删除锁定文件但保留在内存中

时间:2015-06-04 16:56:53

标签: powershell process

直到最近,我们一直在部署.exe应用程序,只需将它们手动复制到服务器上的目标文件夹即可。但是,通常,文件在部署时已经运行(文件是从SQL Server作业调用的) - 有时甚至是多个实例。我们不希望在它运行的过程中终止这个过程。我们也不能等待它完成,因为它一直被调用,有时多次同时被调用。

作为一种解决方法,我们所做的就是剪切和粘贴"通过Windows资源管理器将.exe文件转换为另一个文件夹。显然,它的作用是移动文件(实际上是删除)但将其保存在RAM中,以便正在使用它的进程可以继续而不会出现问题。然后我们将新文件放在那里,当任何后来的程序调用它时会被调用。

我们现在已转向自动部署工具,我们需要一种自动执行此操作的方式。

Stop-Process -name SomeProcess
PowerShell中的

会杀死我不想做的过程。

有办法做到这一点吗? (C#也没关系。)

谢谢,

2 个答案:

答案 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的代码。这样,当推出新版本时,您可以创建一个新文件夹,将文件放入其中,并更新指向它的表。这将允许任何仍然活动的线程访问旧版本,并且任何新线程将获取新的可执行文件。然后,您可以在不再需要之后删除旧文件。