繁体   English   中英

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

[英]Powershell Delete Locked File But Keep In Memory

直到最近,我们一直在通过简单地手动将.exe应用程序复制到服务器上的目标文件夹来对其进行部署。 但是,在部署时,该文件通常已经在运行(从SQL Server作业中调用该文件),有时甚至是多个实例。 我们不想在进程运行时终止它。 我们也不能等待它完成,因为它不断被调用,有时会并发多次。

解决方法是,我们通过Windows资源管理器将.exe文件“剪切并粘贴”到另一个文件夹中。 显然,此操作是将文件移动(实际上是删除),但将其保留在RAM中,以便使用该文件的进程可以继续进行而不会出现问题。 然后我们将新文件放到那里,以后任何程序调用它时都会调用它。

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

Stop-Process -name SomeProcess

在PowerShell中将终止该进程,我不想这样做。

有没有办法做到这一点? (C#也可以。)

谢谢,

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"

由于您正在利用SQL Server来调用EXE。 为什么要添加一个包含文件最新版本路径的表,并修改触发EXE的代码。 这样,当推出新版本时,您可以创建一个新文件夹,将文件放在其中,并更新指向它的表。 这样一来,所有仍处于活动状态的线程都可以访问旧版本,而任何新线程都可以提取新的可执行文件。 然后,您可以删除不再需要的旧文件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM