Вызов методов с помощью переменных

От PowerShell можно получать массу удовольствия. В этом есть смысл – мы тратим много сил на создание языка и, почему бы нам не сделать это удовольствием?
Вы проводите много времени на работе, почему бы вам не получать удовольствие от своих инструментов? Верно?

Так, наше позднее связывание имен позволяет вам сделать кое-что действительно классное, по-настоящему мощную штуку. Вот, например:

 PS> $d=Get-Date 
PS> foreach ($p in "Day","hour","minute" {"$p :  " + $d.$p } 
Day :  5 
hour :  8 
minute :  53

Это позволит вам написать немного отличного кода. Начав делать это, вы очень быстро захотите проделать то же самое с методами, но просто так это у вас не выйдет:

 

 PS> foreach ($p in "AddDays","AddHours","AddMinutes"){"$p :  " + $d.$p(1) } 
Unexpected token '(' in expression or statement. 
At line:1 char:67 
Unexpected token '1' in expression or statement. 
At line:1 char:68 
Missing closing '}' in statement block. 
At line:1 char:69 
Unexpected token ')' in expression or statement. 
At line:1 char:69

 

Ниже показано, как заставить это работать: вам нужно указать метод как свойство, а затем вызвать метод Invoke() этого свойства. Это звучит немного странно, так что давайте посмотрим, что происходит, когда метод объявляется как свойство

 
PS> $d.AddDays 
MemberType          : Method 
OverloadDefinitions : {System.DateTime AddDays(double value)} 
TypeNameOfValue     : System.Management.Automation.PSMethod 
Value               : System.DateTime AddDays(double value) 
Name                : AddDays 
IsInstance          : True 
__________________________________________________________________________________________________________________________________ 
PS> $d.AddDays | Get-Member -View ALL i* 
   TypeName: System.Management.Automation.PSMethod 
Name       MemberType Definition                                            
----       ---------- ----------                                            
Invoke     Method     System.Object Invoke(Params System.Object[] arguments) 
IsInstance Property   System.Boolean IsInstance {get;}    

После такого изменения – посмотрите, как это работает:

 

 
PS> foreach ($p in "AddDays","AddHours","AddMinutes"){"$p :  " + $d.$p.Invoke(1) } 
AddDays :  01/06/2009 08:53:53 
AddHours :  01/05/2009 09:53:53 
AddMinutes :  01/05/2009 08:54:53

Не скучайте!

 

Джеффри Сновер (Jeffrey Snover) [MSFT]
Windows Management Partner Architect
Посетите английский блог команды  Windows PowerShell:    https://blogs.msdn.com/PowerShell
Посетите Windows PowerShell ScriptCenter:  https://www.microsoft.com/technet/scriptcenter/hubs/msh.mspx

Перевод: Виктор Горбунков