Domanda

%WINDIR%\system32\inetsrv\appcmd.exe set site /site.name:"WebRole_IN_0_CB" /[Path='/'].applicationPool:"ASP.NET v4.0" >>CBLog.log
powershell.exe -command Set-ExecutionPolicy Unrestricted
powershell.exe .\CheckIfSuccessful.ps1

Vorrei eseguire lo script di cui sopra e se appcmd.exe non può eseguire a causa del sito non essendo ancora e pronto vorrei avere il seguente messaggio di errore nel file CBLog.log.

ERROR (messaggio: Impossibile trovare l'oggetto sito con identificatore "WebRole_IN_0_CB". )

Nel CheckIfSuccessful.ps1 vorrei creare uno script PowerShell per ciclo, che esegue il comando appcmd e controlla l'errore di nuovo. Poi posti letto per 5 secondi e poi tentativi, fino a quando non riesce.

Come faccio a fare questo in PowerShell?

molto apprezzato,

UPDATE:

Ok, molte grazie per la punta con $ lastexitcode, mentre sembra promettente. Sembra che io abbia problemi con la conversione di singoli quoates in PowerShell: (Il sotto è parte del mio comando iniziale appcmd)

/[Path='/'].applicationPool:"ASP.NET v4.0"

Come faccio a Cita questo in PowerShell? Ho cercato di semplificare in modo che PowerShell ha meno problemi con esso, ma sembra il mio comando è ora sbagliata, come si dice ora:

ERRORE (messaggio:. Impossibile trovare l'oggetto sito con identificatore "v4.0")

 & $Env:WinDir\system32\inetsrv\appcmd.exe set site '/site.name:"WebRole_IN_0_CB"' "/[Path='/'].applicationPool:`"ASP.NET v4.0`"" >CBLog.log
if($lastexitcode -ne '0')
{
    while($lastexitcode -ne '0')
    {
        Start-Sleep -s 5
        & $Env:WinDir\system32\inetsrv\appcmd.exe set site '/site.name:"WebRole_IN_0_CB"' "/[Path='/'].applicationPool:`"ASP.NET v4.0`"" >CBLog.log
    }
}

UPDATE II: Sono fuggito in modo corretto. Ma ancora ottengo il messaggio di errore. Se faccio funzionare il solo appcmd dopo aver creato quel sito, il file di registro è ok con esso. Qualche suggerimento per favore?

È stato utile?

Soluzione

Il $lastexitcode variabile speciale ti dà il codice di uscita dell'ultimo eseguibile nativo (non vale a dire cmdlet) che è stato eseguito. Questo avrà valori diversi a seconda dei risultati dell'operazione. Ad esempio, sarà 5 se incontri APPCMD accesso negato. Dovrebbe essere 0 se l'ultimo comando completato successfuolly.

Assicurati di controllare questa variabile immediatamente dopo aver eseguito appcmd e nello stesso script. In caso contrario, si rischia di ottenere l'ExitCode da powershell.exe e non da appcmd.exe

Altri suggerimenti

Mi rendo conto che il problema originale ha probabilmente anela stati risolti, ma per il bene di Googler colpire questa domanda, ho scritto una funzione di uso generale (avanzato) per riprovare shell comandi (cmd). In aggiunta a $ LASTEXITCODE può anche analizzare il flusso di errore (con alcuni strumenti, il codice di uscita può essere una bugia).

function Call-CommandWithRetries
{
 [CmdletBinding()]
 param( 
     [Parameter(Mandatory=$True)]
     [string]$Command,
     [Array]$Arguments,
     [bool]$TrustExitCode = $True,
     [int]$RetrySleepSeconds = 10,
     [int]$MaxAttempts = 10,
     [bool]$PrintCommand = $True
 )

 Process
 {
  $attempt = 0
  while ($true)
  {   
   Write-Host $(if ($PrintCommand) {"Executing: $Command $Arguments"} else {"Executing command..."}) 
   & $Command $Arguments 2>&1 | tee -Variable output | Write-Host

   $stderr = $output | where { $_ -is [System.Management.Automation.ErrorRecord] }
   if ( ($LASTEXITCODE -eq 0) -and ($TrustExitCode -or !($stderr)) )
   {
    Write-Host "Command executed successfully"
    return $output
   }

   Write-Host "Command failed with exit code ($LASTEXITCODE) and stderr: $stderr" -ForegroundColor Yellow
   if ($attempt -eq $MaxAttempts)
   {
    $ex = new-object System.Management.Automation.CmdletInvocationException "All retry attempts exhausted"
    $category = [System.Management.Automation.ErrorCategory]::LimitsExceeded
    $errRecord = new-object System.Management.Automation.ErrorRecord $ex, "CommandFailed", $category, $Command
    $psCmdlet.WriteError($errRecord)
    return $output
   }

   $attempt++;
   Write-Host "Retrying test execution [#$attempt/$MaxAttempts] in $RetrySleepSeconds seconds..."
   Start-Sleep -s $RetrySleepSeconds
  }
 }
}

Per ulteriori informazioni (compresa la documentazione completa) vedere https://www.ohadsoft.com/2016/04/invoking-arbitrary-shell-cmd-commands-in-powershell .

Nel tuo caso si dovrebbe fare qualcosa di simile

$appCmd = [io.path]::combine($env:WINDIR, 'system32', 'inetsrv', 'appcmd.exe')
$appCmdArg = @('set', 'site', '/site.name:"WebRole_IN_0_CB"', '/[Path=''/''].applicationPool:"ASP.NET v4.0"')
$output = Call-CommandWithRetries $appCmd $appCmdArgs
# write $output to log etc
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top