none
Windows Server 2012 | Hyper-V Modul -> Disable/Enable VMIntegrationservice RRS feed

  • Frage

  • Hab mal ne frage,

    wenn ich

    get-vmintegrationservice -Name VSS -VMName test | disable-vmintegrationservice $_ 

    ausführe, erhalte ich den Fehler:

    Disable-VMIntegrationService : Das Argument für den Parameter "Name" kann nicht überprüft werden. Das Argument istNULL oder leer. Geben Sie ein Argument an, das nicht NULL oder leer ist, und führen Sie dann den Befehl erneut aus.In Zeile:1 Zeichen:35

    wenn ich jedoch folgendes ausführe :

    get-vmintegrationservice -Name VSS -VMName test |%{ disable-vmintegrationservice $_ }

    wird der Befehl ohne Probleme ausgeführt. Kann mir das jemand erklären ?

    MFG
    Kamil

    Dienstag, 19. März 2013 15:47

Antworten

  • Darüber habe ich mich auch schon geärgert!

    Das ist nun mal vom PowerShell Team als Syntax so festgelegt! Da musst du die Fragen!
    Der PowerShell Parser kann das anders wohl nicht auflösen.
    Um in der PowerShell das Objekt $_ das sich aktuell in der Pipeline befindet anzusprechen, ist nun mal ForEach-Object (Alias %) nötig!

    Eben so könntest du fragen warum man bei IF() Klammern setzen muss, das ist eben die PowerShell Syntax!


    Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
    German ? Come to German PowerShell Forum!

    • Bearbeitet Peter Kriegel Mittwoch, 20. März 2013 07:03
    • Als Antwort markiert Kamil Kosek Mittwoch, 20. März 2013 07:16
    Mittwoch, 20. März 2013 07:01

Alle Antworten

  • Darüber habe ich mich auch schon geärgert!

    Das ist nun mal vom PowerShell Team als Syntax so festgelegt! Da musst du die Fragen!
    Der PowerShell Parser kann das anders wohl nicht auflösen.
    Um in der PowerShell das Objekt $_ das sich aktuell in der Pipeline befindet anzusprechen, ist nun mal ForEach-Object (Alias %) nötig!

    Eben so könntest du fragen warum man bei IF() Klammern setzen muss, das ist eben die PowerShell Syntax!


    Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
    German ? Come to German PowerShell Forum!

    • Bearbeitet Peter Kriegel Mittwoch, 20. März 2013 07:03
    • Als Antwort markiert Kamil Kosek Mittwoch, 20. März 2013 07:16
    Mittwoch, 20. März 2013 07:01
  • Ahh... Danke dir für die Antwort :)

    Das mit den Klammern beim IF kenn ich so von der C Programmierung. Aber das es mit dem Pipelineoperator schon immer so ist,... erschreckend das ich es erst jetzt merke :/   ....da bestand wohl nie der Bedarf für mich:)

    Gruß

    Kamil

    Mittwoch, 20. März 2013 07:16
  • Ich habe da noch eine Technische Begründung die richtiger ist als die erste Antwort!

    Die PowerShell Pipeline hat drei Phasen.
    Eine Initialisierungs-Phase in dieser werden von allen Pipeline abschnitten der Begin{} ScriptBlock einmalig ausgeführt (z.B. Datenbank öffnen), bevor Objekte von der Pipeline empfangen werden.
    Danach wird für jedes Objekt in der Pipeline der Process{} ScriptBlock ausgeführt, hier geschieht die eigentliche Arbeit.
    Zum Schluss wenn kein Objekt mehr in der Pipeline ist wird von jedem PowerShell Pipeline Abschnitt der End{} ScriptBlock einmalig ausgeführt. Hier hat man die Möglichkeit aufräumarbeiten (z.B. Datenbank schließen) durchzuführen.

    Dies Bietet dir auch das ForEach-Object Cmdlet!

    Alle PowerShell Cmdlets durchlaufen diese 3 Phasen, ebenso die Advanced Function die man selbst entwickeln kann!

    Um diese Verhalten in allen Pipeline Abschnitten zu garantieren, kann ein Code in diesem Fall ohne ForEach-Object nicht richtig geparst werden!
    Um in der PowerShell das Objekt $_ das sich aktuell in der Pipeline befindet anzusprechen, ist nun mal ForEach-Object (Alias %) nötig!

    Siehe: Get-Help about_Language_Keywords
    Siehe: Get-Help ForEach-Object –Full
    Siehe: Get-Help about_Functions_Advanced_Methods



    THEMA
        about_Functions_Advanced_Methods

        Begin
          Dieser Block wird verwendet, um eine optionale einmalige
          Vorverarbeitung für die Funktion bereitzustellen. Die Windows
          PowerShell-Laufzeit verwendet den Code in diesem Block einmal
          für jede Instanz der Funktion in der Pipeline.


        Process
          Über diesen Block wird die datensatzweise Verarbeitung für die
          Funktion bereitgestellt. Dieser Block kann je nach Eingabe für
          die Funktion beliebig oft oder gar nicht verwendet werden. Wenn
          die Funktion beispielsweise den ersten Befehl in der Pipeline
          bildet, wird der Process-Block einmal verwendet. Wenn die
          Funktion nicht den ersten Befehl in der Pipeline bildet, wird
          der Process-Block einmal für jede Eingabe verwendet, die die
          Funktion von der Pipeline empfängt. Wenn keine Pipelineeingabe
          vorhanden ist, wird der Process-Block nicht verwendet.

          Dieser Block muss definiert werden, wenn ein Funktionsparameter zum
          Akzeptieren der Pipelineeingabe festgelegt wird. Wenn dieser Block
          nicht definiert ist und der Parameter Eingaben von der Pipeline
          akzeptiert, werden über die Pipeline keine Werte an die Funktion
          übergeben.

          Wenn die Funktion Bestätigungsanforderungen unterstützt (wenn
          der SupportsShouldProcess-Parameter des Parameter-Attributs auf
          $True festgelegt ist), muss zudem der Aufruf der ShouldProcess-M
          ethode innerhalb des Process-Blocks ausgeführt werden.

        End
          Über diesen Block wird die optionale einmalige Vorverarbeitung
          für die Funktion bereitgestellt.

          Im folgenden Beispiel wird die Gliederung in einer Funktion mit
          einem Begin-Block für die einmalige Vorverarbeitung, einem
          Process-Block für die Verarbeitung mehrerer Datensätze und
          einem End-Block für die einmalige Nachverarbeitung veranschaulicht.

              Function Test-ScriptCmdlet
              {
                [CmdletBinding(SupportsShouldProcess=$True)] Param
                ($Parameter1)
                Begin{}
                Process{}
                End{}
              }


    Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
    German ? Come to German PowerShell Forum!

    Mittwoch, 20. März 2013 07:40