gpt4 book ai didi

powershell - 如何确保 IIS 网站在 Powershell 中完全停止?

转载 作者:行者123 更新时间:2023-12-04 09:39:29 25 4
gpt4 key购买 nike

我有一个 Powershell 脚本,可以停止 IIS 网站和相应的应用程序池,然后删除应用程序日志(log4net 日志)。这是脚本片段:

stop-website -name "MyWebsite"
stop-webapppool -name "MyWebsite"
del c:\inetpub\MyWebsite\logs\*.*

问题是 stop-website 和 stop-webapppool 似乎在网站完全关闭之前返回,这导致删除失败,说该文件正在被另一个进程使用:

del : Cannot remove item C:\inetpub\MyWebsite\logs\App.log: The process cannot access the file 'C:\inetpub\MyWebsite\logs\App.log' because it is being used by another process.



如果我在 stop 命令和 del 命令之间添加一个 10 秒的 sleep ,那么日志将被成功删除。虽然这是非常hackish 并且不可靠。有没有办法强制 stop-website/stop-webapppool 命令在网站/apppool 完全停止之前不返回?

谢谢。

从以下链接实现解决方案。如果 IIS 进程没有停止,我将等待约 60 秒然后终止它。

https://greenfinch.ie/blog/powershellscript.html
        "Stopping IIS site [$name]" >> $logFile
stop-website -name $name

"Stopping app pool [$name]" >> $logFile
stop-webapppool -name $name

$sleepTime = 5
$processId = $TRUE
while ($processId)
{
$processId = Get-WmiObject -Class win32_process -filter "name='w3wp.exe'" |
?{ ($_.CommandLine).Split("`"")[1] -eq $name } |
%{ $_.ProcessId }

if ($sleepTime -gt 60)
{
"Waited [$sleepTime] sec for process [$processId] to stop and it is still running. Killing it." >> $logFile
Stop-Process $processId
break
}

if ($processId)
{
"App pool [$name] is running with process ID: [$processId]. Sleeping for [$sleepTime] sec and then checking again." >> $logFile
Start-Sleep -s $sleepTime
$sleepTime = $sleepTime + 10
}
}

最佳答案

您可以使用这两个命令来检查网站/应用程序的状态,比如 10 秒后,然后仅当返回的状态为 stopped 时才使用 If 语句删除日志。

Get-WebsiteState -name "MyWebsite"
Get-WebAppPoolState -name "MyWebsite"

这个循环也应该对你有帮助
$currentRetry = 0;
$success = $false;
do{
$status = Get-WebAppPoolState -name "MyWebsite"
if ($status -eq "Stopped"){
<....your code here....>
$success = $true;
}
Start-Sleep -s 10
$currentRetry = $currentRetry + 1;
}
while (!$success -and $currentRetry -le 4)

2019 年 4 月 24 日更新

基于评论和当前 cmdlet document ,看来返回类型确实是一个对象。因此,大概可以按照注释或下面的行代码段进行处理。作者无法再访问 Windows Server 环境,因此没有直接修改原始答案,也无法测试更新
if ($status.Value -eq "Stopped")

关于powershell - 如何确保 IIS 网站在 Powershell 中完全停止?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37120790/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com