如何使用powershell脚本启动和停止IIS中的应用程序池

ltskdhd1  于 2023-03-02  发布在  Shell
关注(0)|答案(8)|浏览(323)

我想使用powershell脚本在IIS中启动和停止应用程序池。我曾尝试编写脚本,但我没有得到这个。

k4ymrczo

k4ymrczo1#

你可以用这个

    • 如果您使用(PowerShell 2.0)导入Web管理模块**
import-module WebAdministration

请先检查应用程序池的状态。如果应用程序池已停止,则会出现异常。

    • 停止应用程序池:**
$applicationPoolName = 'DefaultAppPool'

if((Get-WebAppPoolState -Name $applicationPoolName).Value -ne 'Stopped'){
    Write-Output ('Stopping Application Pool: {0}' -f $applicationPoolName)
    Stop-WebAppPool -Name $applicationPoolName
}
    • 启动应用程序池:**
if((Get-WebAppPoolState -Name $applicationPoolName).Value -ne 'Started'){
    Write-Output ('Starting Application Pool: {0}' -f $applicationPoolName)
    Start-WebAppPool -Name $applicationPoolName
}
    • 权限:您必须是"IIS管理员"组的成员。**
2w3rbyxf

2w3rbyxf2#

目前,IISAdminstration模块已经基本取代了WebAdministration。
因此,如果您使用的是Windows 10 / Server 2016,则可以按如下方式使用Get-IISAppPool

Import-Module IISAdministration
(Get-IISAppPool "name").Recycle()
yuvru6vn

yuvru6vn3#

要使用PowerShell停止应用程序池,请使用

Stop-WebAppPool -Name YourAppPoolNameHere

要启动应用程序池

Start-WebAppPool -Name YourAppPoolNameHere

您需要安装WebAdministration模块,因此请使用以下命令检查是否已安装

Get-Module -ListAvailable
p3rjfoxz

p3rjfoxz4#

您可以使用下面的powershell脚本分别停止和停止所有应用程序池。下面的第二行提升权限。您可以排除此权限并仅以管理员身份运行。

停止所有应用程序池脚本

Import-Module WebAdministration

if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) { Start-Process powershell.exe "-NoProfile -ExecutionPolicy Bypass -File `"$PSCommandPath`"" -Verb RunAs; exit }

$AppPools=Get-ChildItem IIS:\AppPools | Where {$_.State -eq "Started"}

ForEach($AppPool in $AppPools)
{
 Stop-WebAppPool -name $AppPool.name
# Write-Output ('Stopping Application Pool: {0}' -f $AppPool.name)
}

启动所有应用程序池脚本

Import-Module WebAdministration

    if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) { Start-Process powershell.exe "-NoProfile -ExecutionPolicy Bypass -File `"$PSCommandPath`"" -Verb RunAs; exit }

    $AppPools=Get-ChildItem IIS:\AppPools | Where {$_.State -eq "Stopped"}
    ForEach($AppPool in $AppPools)
    {
     Start-WebAppPool -name $AppPool.name
    # Write-Output ('Starting Application Pool: {0}' -f $AppPool.name)
    }
von4xj4u

von4xj4u5#

我在Azure管道中使用以下代码:

停止池:

Import-Module -Name 'C:\Windows\System32\WindowsPowerShell\v1.0\Modules\WebAdministration\WebAdministration.psd1';

$AppPoolName = 'DefaultAppPool';
$AppPoolState = (Get-WebAppPoolState -Name $AppPoolName).Value;
$WasStarted = $false;
$Timeout = [System.TimeSpan]::FromMinutes(1);
$StopWatch = New-Object -TypeName 'System.Diagnostics.Stopwatch';
$StopWatch.Start();
# Possible status: "Starting", "Started", "Stopping", "Stopped" and "Unknown".
while ($AppPoolState -ne 'Stopped') {
  if ($AppPoolState -eq 'Started') {
    $WasStarted = $true;
    Stop-WebAppPool -Name $AppPoolName;
  }
  Start-Sleep -Seconds 2;
  if ($StopWatch.Elapsed -gt $Timeout) {
    throw New-Object -TypeName 'System.TimeoutException' -ArgumentList "Timeout of $($Timeout.TotalSeconds) seconds exceeded!";
  }
  $AppPoolState = (Get-WebAppPoolState -Name $AppPoolName).Value;
}

启动池:

Import-Module -Name 'C:\Windows\System32\WindowsPowerShell\v1.0\Modules\WebAdministration\WebAdministration.psd1';

$AppPoolName = 'DefaultAppPool';
$AppPoolState = (Get-WebAppPoolState -Name $AppPoolName).Value;
$WasStopped = $false;
$Timeout = [System.TimeSpan]::FromMinutes(1);
$StopWatch = New-Object -TypeName 'System.Diagnostics.Stopwatch';
$StopWatch.Start();
# Possible status: "Starting", "Started", "Stopping", "Stopped" and "Unknown".
while ($AppPoolState -ne 'Started') {
  if ($AppPoolState -eq 'Stopped') {
    $WasStopped = $true;
    Start-WebAppPool -Name $AppPoolName;
  }
  Start-Sleep -Seconds 2;
  if ($StopWatch.Elapsed -gt $Timeout) {
    throw New-Object -TypeName 'System.TimeoutException' -ArgumentList "Timeout of $($Timeout.TotalSeconds) seconds exceeded!";
  }
  $AppPoolState = (Get-WebAppPoolState -Name $AppPoolName).Value;
}

变量$WasStarted$WasStopped是本示例中未使用的额外信息,但可用于确定是否应在完成新版本部署后重新启动应用程序池(因为它之前已停止)。

vlju58qv

vlju58qv6#

必须使用Import-Module导入WebAdministration模块,然后才能使用Start-WebAppPoolStop-WebAppPool

gcmastyq

gcmastyq7#

来自微软文档https://learn.microsoft.com/en-us/powershell/module/webadminstration/restart-webapppool?view=winserver2012-ps
重新启动-WebAppPool回收应用程序池。
这样你就不用考虑停、等、再开始了。

Import-Module WebAdministration

对于特定的正在运行的AppPool

$applicationPoolName = 'DefaultAppPool'
Get-ChildItem IIS:\AppPools | Where {$_.State -ne "Stopped" -and $_.name -eq $applicationPoolName} | Restart-WebAppPool

对于所有正在运行的AppPools

Get-ChildItem IIS:\AppPools | Where {$_.State -ne "Stopped"} | Restart-WebAppPool
dy1byipe

dy1byipe8#

正如Mitch Pomery在评论中提到的,apppool不会立即停止。因此,我的CI脚本无法将文件复制到apppool仍在使用的目录中。相反,我恢复到appcmd工具(显然是等待apppool真正停止),但仍然使用WebAdministration模块检查池是否正在运行。

Import-Module WebAdministration
if ((Get-WebAppPoolState -Name PCSServer).Value -ne 'Stopped'){ C:\Windows\system32\inetsrv\appcmd stop apppool "PCSServer-WS" }
Expand-Archive -Path MBE.zip -DestinationPath $DEPLOY_PATH -Force
C:\Windows\system32\inetsrv\appcmd start apppool "PCSServer-WS"

相关问题