[英]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.