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