Вызов методов с помощью переменных
От 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
Перевод: Виктор Горбунков