2017-04-20 5 views
1

Ich habe wenig Erfahrung mit PowerShell, also versuchte ich einige bitweise Operationen während der Eingabe in Binärcode (rein für die Lesbarkeit). Ich habe die folgenden Funktionen verwendet, um zu und von binär zu konvertieren und sie scheinen zu arbeiten.Ausdrücke als PowerShell-Funktionsparameter

function bin($a){ 
    return [convert]::ToString($a,2) 
} 
function unbin($a){ 
    return [convert]::ToInt64($a,2) 
} 

Dann versuchte ich folgendes auszuführen: 1111011

bin(unbin('11001101') -bxor unbin('10110110')) 

erwarten den Ausgang.

Zu meiner Überraschung bekomme ich stattdessen das Ergebnis 11001101 (das Ergebnis von bin(unbin('11001101'))).

Um meinen Code bekomme ich die unbin Anrufe in weiteren Klammern zu wickeln zu arbeiten brauchte, und ich kann nicht verstehen, warum:

bin((unbin('11001101')) -bxor (unbin('10110110'))) 

Warum sind diese zusätzlichen Klammern benötigt?

Antwort

2

Beachten Sie, dass der Aufruf von Funktionen in PowerShell dem Aufruf von Cmdlets, und .NET-Methoden ähnlicher ist. Sie haben also viele unnötige Klammern drin und einige relevante fehlen. Der folgende Code

bin(unbin('11001101') -bxor unbin('10110110')) 

gibt ein Argument zu bin (Die vollständigen Inhalte der Klammern), aber drei zur ersten unbin Aufruf. Es ist äquivalent zu

unbin '11001101' -bxor "unbin('10110110')" 

(wenn ich mich nicht irre, Details variieren können (könnten vier) sein, aber das ist der Kern von ihm).

Beim Aufrufen einer PowerShell-Funktion werden Argumente nicht in Klammern übergeben. Und die Operanden zu -bxor müssen Ausdrücke selbst sein, so haben alle Pipelines eingeklammert werden:

bin ((unbin '11001101') -bxor (unbin '10110110')) 
+0

Okay, das ist toll, warum dann brauchen Objektmethoden Klammern z.B. '" test ".Split" e "' funktioniert nicht, während "" test ".Split (" e ")' tut? –

+0

Hinweis Ich habe wenig Erfahrung mit PowerShell, daher ist der Unterschied zwischen Cmdlets, Methoden usw. an dieser Stelle für mich verloren. –

+0

.NET-Methoden werden ähnlich wie in C# aufgerufen. Cmdlets und Funktionen sind entworfen - es ist schließlich eine Shell - mehr wie Shell-Befehle, bei denen Argumente nur durch Leerzeichen getrennt sind. – Joey