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

use*_*808 7 iis powershell

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

stop-website -name "MyWebsite"
stop-webapppool -name "MyWebsite"
del c:\inetpub\MyWebsite\logs\*.*
Run Code Online (Sandbox Code Playgroud)

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

del:无法删除项目C:\ inetpub\MyWebsite\logs\App.log:进程无法访问文件'C:\ inetpub\MyWebsite\logs\App.log',因为它正由另一个进程使用.

如果我在stop命令和del命令之间添加10秒睡眠,则会成功删除日志.这是非常hackish但不可靠.有没有办法强制stop-website/stop-webapppool命令在网站/ apppool完全停止之前不返回?

谢谢.


从以下链接实施解决方案.我将等待~60秒然后如果它没有停止则终止IIS进程.

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
            }
        }
Run Code Online (Sandbox Code Playgroud)

Kai*_*hao 15

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

Get-WebsiteState -name "MyWebsite"
Get-WebAppPoolState -name "MyWebsite"
Run Code Online (Sandbox Code Playgroud)

这个循环也应该对你有帮助

$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)
Run Code Online (Sandbox Code Playgroud)

  • 我做了一个调整,以字符串形式获取应用程序池状态:$ status =(Get-WebAppPoolState -name“ MyWebsite”)。Value (2认同)