Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] PowerShell Befehl pclose/popen nur 1x Prozess möglich

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] PowerShell Befehl pclose/popen nur 1x Prozess möglich

    Hallo,

    ich habe eine kleines Problem mit dem Aufruf eines PowerShell Befehls per php. Dazu habe ich folgendes Beispiel, welches so auch funktioniert:

    PHP-Code:
    <?php 
        $command 
    "start /B powershell C:/reports/Report1.ps1 >> C:/temp/log-file.log"
        
    pclosepopen$command'r' ) ); 
    ?>
    Mein Problem allerdings ist: Öffnet User1 die Webseite klappt alles problemlos, öffnet User 2 die Webseite, während das PowerShell Script von User1 noch läuft, wird das PowerShell Script von User2 nicht gestartet. Mir scheint das php immer nur ein PowerShell Prozess zulässt. Ich kann aber beispielsweise nicht verhindern, dass die User getrennt von einander die Webseite öffnen.

    Dabei ist es egal ob ich das mit pclose und popen umsetze (benötige ich, da das Script auf einem IIS läuft und die User sonst warten müssten --> siehe http://www.somacon.com/p395.php) oder das PowerShell Script per exec starte.

    Habt ihr eine Idee woran das liegt? Ich bin über jeden Tipp froh.

    Vielen Dank, viele Grüße

  • #2
    Es wird höchstwahrscheinlich eine Sperrung für schreibenden Zugriff auf eine der beteiligten Dateien liegen.
    Kann es sein, dass die powershell die log-file sperrt, weil dorthin die Ausgabe umgeleitet wird?
    Funktioniert folgendes gleichzeitig?
    PHP-Code:
    $command "start /B powershell C:/reports/Report1.ps1 >> C:/temp/log-file".$user_id.".log"
    Wobei natürlich $user_id irgend ein Wert ist, der sich bei den beiden nutzern auf jedenfall unterscheidet.

    [edit]
    Wie ich oben bereits vermutete ist die Datei gesperrt, sobald du die Ausgabeumleitung nutzt.
    Ich habe mich mal hingesetzt und ein kleines Workaround zusammengesetzt, sodass du das PS Skript vorher an ein anderes PS-Skript übergibst und dieses abwartet bis die Datei wieder zu beschreiben ist:

    WaitForFileUnlock.ps1:
    Code:
    param(
    [string] $powershellScriptFile,
    [string] $outputFile
    )
    
    #http://stackoverflow.com/questions/958123/powershell-script-to-check-application-thats-locking-a-file
    #-> http://mspowershell.blogspot.com.es/2008/07/locked-file-detection.html
    function TestFileLock {
        ## Attempts to open a file and trap the resulting error if the file is already open/locked
        param ([string]$filePath )
        $filelocked = $false
        $fileInfo = New-Object System.IO.FileInfo $filePath
        trap {
            Set-Variable -name filelocked -value $true -scope 1
            continue
        }
        $fileStream = $fileInfo.Open( [System.IO.FileMode]::OpenOrCreate,[System.IO.FileAccess]::ReadWrite, [System.IO.FileShare]::None )
        if ($fileStream) {
            $fileStream.Close()
        }
        $obj = New-Object Object
        $obj | Add-Member Noteproperty FilePath -value $filePath
        $obj | Add-Member Noteproperty IsLocked -value $filelocked
        $obj
    }
    if($powershellScriptFile -and $outputFile){
        $output = &$powershellScriptFile
        while((TestFileLock $outputFile).IsLocked){
            Start-Sleep -s 1
        }
        $output>>$outputFile
    }
    Mit folgendem Aufruf wird nun das weitere PS-Skript aufgerufen, der Output zwischengespeichert und gewartet, bis die Datei beschreibbar ist und dann dort reingeschrieben:
    Code:
    powershell /path/to/WaitForFileUnlock.ps1 C:/reports/Report1.ps1 C:/temp/log-file.log
    War der Beitrag hilfreich? Dann Bedank dich mit einem klick auf .

    Kommentar


    • #3
      hi Dreamwatcher,

      vielen Dank für deinen Beitrag und vor allem vielen Dank für deinen Workaround.

      Es funktioniert nun alles wie gewünscht. Viele Grüße

      Kommentar

      Lädt...
      X