Przekazywanie danych przy użyciu elementu ByPropertyName
Jeśli program Windows PowerShell nie może powiązać danych wejściowych potoku przy użyciu techniki ByValue, próbuje użyć techniki ByPropertyName. Gdy program Windows PowerShell używa techniki ByPropertyName , próbuje dopasować właściwość obiektu przekazanego do parametru polecenia, do którego przekazano obiekt. To dopasowanie odbywa się w prosty sposób. Jeśli obiekt wejściowy ma właściwość Name , zostanie on dopasowany do parametru Name , ponieważ są one takie same. Jednak przekaże on właściwość tylko wtedy, gdy parametr jest zaprogramowany do akceptowania wartości według nazwy właściwości. Oznacza to, że można przekazywać dane wyjściowe z jednego polecenia do drugiego, gdy nie są one logicznie połączone.
Na przykład:
Get-LocalUser | Stop-Process
Pierwsze polecenie umieszcza obiekty typu LocalUser w potok przetwarzania. Drugie polecenie nie ma parametrów, które mogą akceptować tego rodzaju obiekt. Drugie polecenie nie ma również parametrów, które akceptują ogólny obiekt lub obiekt PSObject. W związku z tym technika ByValue kończy się niepowodzeniem.
Ponieważ technika ByValue kończy się niepowodzeniem, program Windows PowerShell zmienia się na technikę ByPropertyName . Aby przewidzieć, co spróbuje wykonać, możesz przejrzeć właściwości obiektów generowanych przez pierwsze polecenie. W tym przykładzie uruchom następujące polecenie:
Get-LocalUser | Get-Member
Należy również utworzyć listę parametrów drugiego polecenia, które może akceptować dane wejściowe potoku przy użyciu elementu ByPropertyName. Aby ustawić listę, wyświetl Pomoc dla drugiego polecenia:
Get-Help Stop-Process -ShowWindow
Tworząc tę listę, zobaczysz, że polecenie Stop-Process ma więcej niż jeden parametr, który akceptuje dane wejściowe potoku przy użyciu polecenia ByPropertyName. Te parametry to –Name i –Id. Obiekty, które Get-LocalUser generuje, nie mają właściwości ID, więc parametr –Id nie jest brany pod uwagę. Obiekty, które tworzy Get-LocalUser , mają właściwość Name . W związku z tym zawartość właściwości Name jest przypisywana do parametru –Name polecenia Stop-Service. Oznacza to, że usługa Stop-Service spróbuje zatrzymać usługę o nazwie, która jest taka sama jak użytkownik. Jeśli spróbujesz wykonać ten krok w programie Windows PowerShell, zauważysz, że wszystkie otrzymane błędy są spowodowane tym, że nie można odnaleźć procesu z nazwą docelową. Jednak nie chcesz wykonywać tego kroku w rzeczywistym scenariuszu.
Zmienianie nazw właściwości
Najczęściej nazwa właściwości z obiektu wyjściowego nie jest dokładnie zgodna z nazwą parametru wejściowego. Nazwę właściwości można zmienić przy użyciu polecenia Select-Object i utworzyć właściwość obliczeniową. Aby na przykład wyświetlić procesy uruchomione na wszystkich komputerach w usłudze Active Directory systemu Windows Server, spróbuj uruchomić następujące polecenie:
Get-ADComputer -Filter * | Get-Process
Jednak to polecenie nie działa. Brak parametru Get-Process pasującego do nazwy właściwości dla danych wyjściowych Get-ADComputer. Wyświetl dane wyjściowe polecenia Get-ADComputer | Get-Member i Get-Help Get-Process, a zobaczysz, że musisz dopasować właściwość Name polecenia Get-ADComputer do parametru -ComputerName polecenia Get-Process. Można to zrobić, używając polecenia Select-Object i zmieniając nazwę właściwości Get-ADComputerName na ComputerName, a następnie przekazując wyniki do polecenia Get-Process. Następujące polecenie będzie działać:
Get-ADComputer -Filter * | Select-Object @{n='ComputerName';e={$PSItem.Name}} | Get-Process
Innym typowym zastosowaniem techniki ByPropertyName jest importowanie danych z wartości rozdzielanej przecinkami (CSV) lub podobnych plików, a dane te są przesyłane do polecenia, aby można było przetworzyć określoną listę użytkowników, komputerów lub innych zasobów.