none
Eine Funktionen - einmal Main und einmal Backgroundjob RRS feed

  • Frage

  • Hallo,

    ich habe folgendes Problem. Ich habe in Main eine Funktion definiert und für den Start-Job auch nochmal dieselbe Funktion. Warum zweimal? Der Backgroundjob hat einen eigenen Scope und kann nicht auf die Main zugreifen. Ich hätte allerdings gerne die Funktion nur einmal definiert und dann den Job die mitgegeben.

    Aktueller Stand(aus dem Kopf, kann also fehlerhaft sein) :

    function test{
        #blabla
    }
    
    Start-Job $job -ScriptBlock{function test{#blabla}}
    
    test

    Mein Ziel wäre es sowas:

    function test{
        #blabla
    }
    
    Start-Job $job -ScriptBlock{function test}
    
    test

    Ich möchte also nur einmal die Funktion definieren, aber sowohl im Main als auch im Backgroundjob verwenden. Wie mache ich das?

    Funktion, um die es gerade geht:

    function Get-KeyState([uint16]$keyCode)
    {
      $signature = '[DllImport("user32.dll")]public static extern short GetKeyState(int nVirtKey);'
      $type = Add-Type -MemberDefinition $signature -Name User32 -Namespace GetKeyState -PassThru
      return [bool]($type::GetKeyState($keyCode) -band 0x80)
    } 

    Ich habe schon 2 Tage alles versucht. Ich hoffe ihr könnt mir behilflich sein.

    mfg werdas34

    Dienstag, 24. September 2019 15:28

Antworten

  • Moin,

    wenn Du die Funktion in einem Text Block in Main definierst, kannst Du sie für den Job ergänzen, und die Definition der Funktion ist trotzdem einmalig:

    $tx_func = @"
    function Do-Stuff {
        Write-Output 'Stuff' 
    }
    "@
    $sb = [scriptblock]::Create($tx_func)
    . $sb
    Do-Stuff
    $tx_job = $tx_func + "`nDo-Stuff"
    $sb_job = [scriptblock]::Create($tx_job)
    Start-Job -ScriptBlock $sb_job

    Warum Dot-Sourcing aus Datei Dir nicht geholfen haben sollte, kann ich aber nicht beurteilen, eigentlich funktioniert das.


    Evgenij Smirnov

    http://evgenij.smirnov.de

    Dienstag, 24. September 2019 20:46
  • Habs heute zum laufen gebracht. Der Fehler lag an dem relativen Pfad.  Da Start-Job quasi eine neue Powershell Instanz startet, findet er den Pfad nicht. Entweder man verwendet statt dem relativen Pfad . "$PSScriptRoot\Function.ps1" oder statt Start-job Runspace.
    Donnerstag, 26. September 2019 16:50

Alle Antworten

  • Vielleicht hilft dir ja dieser Tipp da weiter:
    https://www.sepago.de/blog/powershell-scripts-funktionen-und-module-einbinden/
    Dienstag, 24. September 2019 18:58
  • Leider nein. Dot sourcing und Module habe ich schon probiert. Das Einbinden von Scripten habe ich verstanden, das große Problem ist der Backgroundjob, da der seine eigene Powershell Instanz startet und deshalb alles definiert braucht.
    Dienstag, 24. September 2019 20:24
  • Moin,

    wenn Du die Funktion in einem Text Block in Main definierst, kannst Du sie für den Job ergänzen, und die Definition der Funktion ist trotzdem einmalig:

    $tx_func = @"
    function Do-Stuff {
        Write-Output 'Stuff' 
    }
    "@
    $sb = [scriptblock]::Create($tx_func)
    . $sb
    Do-Stuff
    $tx_job = $tx_func + "`nDo-Stuff"
    $sb_job = [scriptblock]::Create($tx_job)
    Start-Job -ScriptBlock $sb_job

    Warum Dot-Sourcing aus Datei Dir nicht geholfen haben sollte, kann ich aber nicht beurteilen, eigentlich funktioniert das.


    Evgenij Smirnov

    http://evgenij.smirnov.de

    Dienstag, 24. September 2019 20:46
  • Kannst du mir ein Beispiel nennen wie Dot-Sourcing in diesem Fall funktionieren würde? Vielleicht habe ich ja nur was falsch gemacht.

    Also ich habe ein Script namens Function.ps1 und in diesem Script befindet sich die Get-KeyState Funktion von oben.

    Um dies in Main hinzuzufügen mache ich folgendes:

    . ".\Function.ps1"
    Wie genau gebe ich sie dem Start-Job mit, damit im Backgroundjob auf diese Funktion, aus Function.ps1, zugegriffen werden kann?
    Mittwoch, 25. September 2019 14:34
  • Wie genau gebe ich sie dem Start-Job mit, damit im Backgroundjob auf diese Funktion, aus Function.ps1, zugegriffen werden kann?

    Als erste Zeile des ScriptBlocks.

    Evgenij Smirnov

    http://evgenij.smirnov.de

    Mittwoch, 25. September 2019 17:28
  • Also in etwa so?

    $job = Start-Job -ScriptBlock {. ".\Function.ps1" #und weiterer Code} -ArgumentList VirtualKeycode

    Wäre ja fast zu eiinfach...

    Mittwoch, 25. September 2019 18:03
  • Ja, so meine ich das. Musst auf Separatoren achten und evtl. Zeilenumbrüche einfügen.

    Evgenij Smirnov

    http://evgenij.smirnov.de

    Mittwoch, 25. September 2019 20:31
  • Habs heute zum laufen gebracht. Der Fehler lag an dem relativen Pfad.  Da Start-Job quasi eine neue Powershell Instanz startet, findet er den Pfad nicht. Entweder man verwendet statt dem relativen Pfad . "$PSScriptRoot\Function.ps1" oder statt Start-job Runspace.
    Donnerstag, 26. September 2019 16:50