Powershell 删除锁定的文件但保留在内存中
Powershell Delete Locked File But Keep In Memory
直到最近,我们一直通过简单地将 .exe 应用程序手动复制到服务器上的目标文件夹来部署它们。但是,通常情况下,该文件在部署时已经 运行(该文件是从 SQL 服务器作业调用的)——有时甚至是多个实例。我们不想在 运行 时终止进程。我们也迫不及待地等待它完成,因为它一直在被调用,有时会同时调用多次。
作为解决方法,我们所做的是 "cut and paste" 通过 Windows 资源管理器将 .exe 文件放入另一个文件夹。显然,它的作用是移动文件(实际上是删除)但将其保存在 RAM 中,以便使用它的进程可以继续而不会出现问题。然后我们将新文件放在那里,当任何以后的程序调用它时,这些文件将被调用。
我们现在已经转向自动化部署工具,我们需要一种自动化的方式来执行此操作。
Stop-Process -name SomeProcess
在 PowerShell 中会终止进程,我不想这样做。
有办法吗?
(C# 也可以。)
谢谢,
因为您使用 SQL 服务器来调用 EXE。为什么要添加包含最新版本文件路径的 table 并修改触发 EXE 的代码。这样当推出新版本时,您可以创建一个新文件夹,将文件放入其中,并更新指向它的 table。这将允许任何仍处于活动状态的线程可以访问旧版本,并且任何新线程都将获取新的 executable。然后您可以删除不再需要的旧文件。
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"
直到最近,我们一直通过简单地将 .exe 应用程序手动复制到服务器上的目标文件夹来部署它们。但是,通常情况下,该文件在部署时已经 运行(该文件是从 SQL 服务器作业调用的)——有时甚至是多个实例。我们不想在 运行 时终止进程。我们也迫不及待地等待它完成,因为它一直在被调用,有时会同时调用多次。
作为解决方法,我们所做的是 "cut and paste" 通过 Windows 资源管理器将 .exe 文件放入另一个文件夹。显然,它的作用是移动文件(实际上是删除)但将其保存在 RAM 中,以便使用它的进程可以继续而不会出现问题。然后我们将新文件放在那里,当任何以后的程序调用它时,这些文件将被调用。
我们现在已经转向自动化部署工具,我们需要一种自动化的方式来执行此操作。
Stop-Process -name SomeProcess
在 PowerShell 中会终止进程,我不想这样做。
有办法吗? (C# 也可以。)
谢谢,
因为您使用 SQL 服务器来调用 EXE。为什么要添加包含最新版本文件路径的 table 并修改触发 EXE 的代码。这样当推出新版本时,您可以创建一个新文件夹,将文件放入其中,并更新指向它的 table。这将允许任何仍处于活动状态的线程可以访问旧版本,并且任何新线程都将获取新的 executable。然后您可以删除不再需要的旧文件。
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"