Share via


Исследуйте Вашу среду [Environment]

Эта тема немного длинная, но я очень рекомендую вам почитать ее и пользоваться инструментами, которые она предоставляет. Я могу уверить вас, что вы будете использовать их пару тысяч раз за следующие пару лет.

.Net предоставляет великолепный класс по имени System.Environment, который сообщает вам все о вашей среде. Это хорошая идея – потратить несколько минут на то, чтобы оторваться от того, что вы сейчас делаете и исследовать этот класс так, чтобы понять всю его мощь. Таким образом, когда возникнет подходящий вопрос, вы всегда сможете легко найти ответ.

Первое, что следует запомнить – как определить тип в PowerShell – с помощью квадратных скобок:

 

 
PS> [System.Environment] 
IsPublic IsSerial Name                                     BaseType 
-------- -------- ----                                     -------- 
True     False    Environment                              System.Object

Следующее, что стоит запомнить – что PowerShell позволяет вам отбросить слово "SYSTEM" из типов:

 

 
PS> [System.Diagnostics.Process] 
IsPublic IsSerial Name                                     BaseType 
-------- -------- ----                                     -------- 
True     False    Process                                  System.ComponentModel.Component 
PS> [Diagnostics.Process] 
IsPublic IsSerial Name                                     BaseType 
-------- -------- ----                                     -------- 
True     False    Process                                  System.ComponentModel.Component 
PS> [Environment] 
IsPublic IsSerial Name                                     BaseType 
-------- -------- ----                                     -------- 
True     False    Environment                              System.Object

Так же, стоит запомнить – что типы могут иметь СТАТИЧЕСКИЕ (STATIC) свойства и методы. Что такое "статические свойства и методы"? Большинство свойств и методов, с которыми вы работаете - это свойства и методы ОБЪЕКТА (OBJECT), иначе говоря, они «свойства того объекта» или «методы, которые могут быть вызваны для того объекта». Статические же свойства и методы не требуют объекта, чтобы работать с ним. Есть множество причин, почему программисты используют статические свойства и методы. Вы обязаны знать что исследовать статические свойства и методы это хорошая привычка, потому что они часто предлагают удивительный функционал. Не все типы имеют статические свойства и методы (большинство – не имеют), но те, которые имеют – представляют очень удобные в использовании свойства и методы, поэтому их надо изучить.

Так как же изучить? С помощью PowerShell, конечно. PowerShell разработан так, чтобы позволить вам исследовать систему. Мы бы хотели, чтобы специалисты были любознательными и интересовались строением своей системы. Мы бы хотели, чтобы вы могли сделать это просто и безопасно (насколько это возможно). Для того, чтобы изучить статические классы и методы, можно использовать командлет Get-Member. Вот что вам требуется знать:

1) Get-Member имеет параметр -STATIC.
2) Вы можете передать экземпляры класса или типы командлету get-member
3) Вместо "Get-Member -Static" можно использовать сокращенные имена (алиасы): "gm -s"

Давайте попробуем:

 

 
PS> Get-Date |Get-Member -Static 
   TypeName: System.DateTime 
Name            MemberType Definition 
----            ---------- ---------- 
Compare         Method     static int Compare(System.DateTime t1, System.DateTime t2) 
DaysInMonth     Method     static int DaysInMonth(int year, int month) 
Equals          Method     static bool Equals(System.DateTime t1, System.DateTime t2), static bool Eq 
FromBinary      Method     static System.DateTime FromBinary(long dateData) 
FromFileTime    Method     static System.DateTime FromFileTime(long fileTime) 
FromFileTimeUtc Method     static System.DateTime FromFileTimeUtc(long fileTime) 
FromOADate      Method     static System.DateTime FromOADate(double d) 
IsLeapYear      Method     static bool IsLeapYear(int year) 
Parse           Method     static System.DateTime Parse(string s), static System.DateTime Parse(strin 
ParseExact      Method     static System.DateTime ParseExact(string s, string format, System.IFormatP 
ReferenceEquals Method     static bool ReferenceEquals(System.Object objA, System.Object objB) 
SpecifyKind     Method     static System.DateTime SpecifyKind(System.DateTime value, System.DateTimeK 
TryParse        Method     static bool TryParse(string s, System.DateTime&, mscorlib, Version=2.0.0.0 
TryParseExact   Method     static bool TryParseExact(string s, string format, System.IFormatProvider 
MaxValue        Property   static System.DateTime MaxValue {get;} 
MinValue        Property   static System.DateTime MinValue {get;} 
Now             Property   System.DateTime Now {get;} 
Today           Property   System.DateTime Today {get;} 
UtcNow          Property   System.DateTime UtcNow {get;} 
PS> Get-Date |gm -s 
   TypeName: System.DateTime 
Name            MemberType Definition 
----            ---------- ---------- 
Compare         Method     static int Compare(System.DateTime t1, System.DateTime t2) 
DaysInMonth     Method     static int DaysInMonth(int year, int month) 
Equals          Method     static bool Equals(System.DateTime t1, System.DateTime t2), static bool Eq 
FromBinary      Method     static System.DateTime FromBinary(long dateData) 
FromFileTime    Method     static System.DateTime FromFileTime(long fileTime) 
FromFileTimeUtc Method     static System.DateTime FromFileTimeUtc(long fileTime) 
FromOADate      Method     static System.DateTime FromOADate(double d) 
IsLeapYear      Method     static bool IsLeapYear(int year) 
Parse           Method     static System.DateTime Parse(string s), static System.DateTime Parse(strin 
ParseExact      Method     static System.DateTime ParseExact(string s, string format, System.IFormatP 
ReferenceEquals Method     static bool ReferenceEquals(System.Object objA, System.Object objB) 
SpecifyKind     Method     static System.DateTime SpecifyKind(System.DateTime value, System.DateTimeK 
TryParse        Method     static bool TryParse(string s, System.DateTime&, mscorlib, Version=2.0.0.0 
TryParseExact   Method     static bool TryParseExact(string s, string format, System.IFormatProvider 
MaxValue        Property   static System.DateTime MaxValue {get;} 
MinValue        Property   static System.DateTime MinValue {get;} 
Now             Property   System.DateTime Now {get;} 
Today           Property   System.DateTime Today {get;} 
UtcNow          Property   System.DateTime UtcNow {get;} 
PS> [DateTime] |gm -s 
   TypeName: System.DateTime 
Name            MemberType Definition 
----            ---------- ---------- 
Compare         Method     static int Compare(System.DateTime t1, System.DateTime t2) 
DaysInMonth     Method     static int DaysInMonth(int year, int month) 
Equals          Method     static bool Equals(System.DateTime t1, System.DateTime t2), static bool Eq 
FromBinary      Method     static System.DateTime FromBinary(long dateData) 
FromFileTime    Method     static System.DateTime FromFileTime(long fileTime) 
FromFileTimeUtc Method     static System.DateTime FromFileTimeUtc(long fileTime) 
FromOADate      Method     static System.DateTime FromOADate(double d) 
IsLeapYear      Method     static bool IsLeapYear(int year) 
Parse           Method     static System.DateTime Parse(string s), static System.DateTime Parse(strin 
ParseExact      Method     static System.DateTime ParseExact(string s, string format, System.IFormatP 
ReferenceEquals Method     static bool ReferenceEquals(System.Object objA, System.Object objB) 
SpecifyKind     Method     static System.DateTime SpecifyKind(System.DateTime value, System.DateTimeK 
TryParse        Method     static bool TryParse(string s, System.DateTime&, mscorlib, Version=2.0.0.0 
TryParseExact   Method     static bool TryParseExact(string s, string format, System.IFormatProvider 
MaxValue        Property   static System.DateTime MaxValue {get;} 
MinValue        Property   static System.DateTime MinValue {get;} 
Now             Property   System.DateTime Now {get;} 
Today           Property   System.DateTime Today {get;} 
UtcNow          Property   System.DateTime UtcNow {get;}

Теперь посмотрим, как вы можете получить доступ к этому. Для доступа к статическим свойствам и методам используйте "::" после имени типа:

 
PS> [Datetime]::Today 
Saturday, December 13, 2008 12:00:00 AM 
PS> [Datetime]::IsLeapYear(2008) 
True

После этого, посмотрим некоторые свойства типа SYSTEM.ENVIRONMENT:

 
PS> [Environment] |gm -s 
   TypeName: System.Environment 
Name                       MemberType Definition 
----                       ---------- ---------- 
Equals                     Method     static bool Equals(System.Object o... 
Exit                       Method     static System.Void Exit(int exitCode) 
ExpandEnvironmentVariables Method     static string ExpandEnvironmentVar... 
FailFast                   Method     static System.Void FailFast(string... 
GetCommandLineArgs         Method     static System.String[] GetCommandL... 
GetEnvironmentVariable     Method     static string GetEnvironmentVariab... 
GetEnvironmentVariables    Method     static System.Collections.IDiction... 
GetFolderPath              Method     static string GetFolderPath(System... 
GetLogicalDrives           Method     static System.String[] GetLogicalD... 
ReferenceEquals            Method     static bool ReferenceEquals(System... 
SetEnvironmentVariable     Method     static System.Void SetEnvironmentV... 
CommandLine                Property   static System.String CommandLine {... 
CurrentDirectory           Property   static System.String CurrentDirect... 
ExitCode                   Property   static System.Int32 ExitCode {get;... 
HasShutdownStarted         Property   static System.Boolean HasShutdownS... 
MachineName                Property   static System.String MachineName {... 
NewLine                    Property   static System.String NewLine {get;} 
OSVersion                  Property   static System.OperatingSystem OSVe... 
ProcessorCount             Property   static System.Int32 ProcessorCount... 
StackTrace                 Property   static System.String StackTrace {g... 
SystemDirectory            Property   static System.String SystemDirecto... 
TickCount                  Property   static System.Int32 TickCount {get;} 
UserDomainName             Property   static System.String UserDomainNam... 
UserInteractive            Property   static System.Boolean UserInteract... 
UserName                   Property   static System.String UserName {get;} 
Version                    Property   static System.Version Version {get;} 
WorkingSet                 Property   static System.Int64 WorkingSet {get;} 
PS> [Environment]::MachineName 
JPSW7-5 
PS> [Environment]::OSVersion 
          Platform ServicePack        Version            VersionString 
          -------- -----------        -------            ------------- 
           Win32NT                    6.1.7004.0         Microsoft Windo... 
PS> [Environment]::ProcessorCount 
2 
PS> [Environment]::UserInteractive 
True 
PS> [Environment]::UserDomainName 
NTDEV 
PS> [Environment]::UserName 
jsnover 
PS> [Environment]::SystemDirectory 
C:\Windows\system32 
PS>

Теперь некоторые методы:

 
PS> [Environment]::GetLogicalDrives() 
C:\ 
D:\ 
E:\ 
PS> [Environment]::GetEnvironmentVariable("PATH") 
%SystemRoot%\system32\WindowsPowerShell\v1.0\;C:\Windows\system32;C:\Window 
s;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\P 
rogram Files\WTT 2.2\Client\;C:\PROGRA~1\CA\SHARED~1\SCANEN~1;C:\Program Fi 
les\CA\eTrust Antivirus;c:\ps 
PS> [Environment]::GetFolderPath() 
Cannot find an overload for "GetFolderPath" and the argument count: "0". 
At line:1 char:29 
+ [Environment]::GetFolderPath <<<< () 
    + CategoryInfo          : NotSpecified: (:) [], MethodException 
    + FullyQualifiedErrorId : MethodCountCouldNotFindBest 
PS>

Обратите внимание на ошибку, которую я получил при вызове метода GetFolderPath() – она указывает на количество аргументов, которые я передал. Теперь посмотрим, как найти описание этого метода. Если вы указываете метод и используете "()", вызывается этот метод. Если вы не указываете "()", а только указываете имя, выдается информация об этом методе:

 

 
PS> [Environment]::GetFolderPath 
MemberType          : Method 
OverloadDefinitions : {static string GetFolderPath(System.Environment+Speci 
                      alFolder folder)} 
TypeNameOfValue     : System.Management.Automation.PSMethod 
Value               : static string GetFolderPath(System.Environment+Specia 
                      lFolder folder) 
Name                : GetFolderPath 
IsInstance          : True

Это означает, что метод получает один аргумент по имени "folder" с типом System.Environment+SpecialFolder. Что же это, черт возьми? 

 

 
PS> [System.Environment+SpecialFolder] 
IsPublic IsSerial Name                                     BaseType 
-------- -------- ----                                     -------- 
False    True     SpecialFolder                            System.Enum

Заметьте, что это перечисление (ENUM). Прелесть перечислений в том, что когда вы указываете неправильное значение – они сообщают, каковы допустимые значения:

 

 
PS> [Environment]::GetFolderPath("burp") 
Cannot convert argument "0", with value: "burp", for "GetFolderPath" to typ 
e "System.Environment+SpecialFolder": "Cannot convert value "burp" to type 
"System.Environment+SpecialFolder" due to invalid enumeration values. Speci 
fy one of the following enumeration values and try again. The possible enum 
eration values are "Desktop, Programs, Personal, MyDocuments, Favorites, St 
artup, Recent, SendTo, StartMenu, MyMusic, DesktopDirectory, MyComputer, Te 
mplates, ApplicationData, LocalApplicationData, InternetCache, Cookies, His 
tory, CommonApplicationData, System, ProgramFiles, MyPictures, CommonProgra 
mFiles"." 
At line:1 char:29 
+ [Environment]::GetFolderPath <<<< ("burp") 
    + CategoryInfo          : NotSpecified: (:) [], MethodException 
    + FullyQualifiedErrorId : MethodArgumentConversionInvalidCastArgument

Так давайте попробуем некоторые из этих значений:

 

 
PS> [Environment]::GetFolderPath("cookies") 
C:\Users\jsnover\AppData\Roaming\Microsoft\Windows\Cookies 
PS> [Environment]::GetFolderPath("mypictures") 
C:\Users\jsnover\Pictures

Но подождите – ситуация становится все лучше и лучше!

Теперь давайте соберем их все вместе. Так как ENUM – это тип и он имеет статические свойства и методы, воспользуемся ими, чтобы найти все пути к папкам:

 

 
PS> [Enum] |gm -s 
   TypeName: System.Enum 
Name              MemberType Definition 
----              ---------- ---------- 
Equals            Method     static bool Equals(System.Object objA, Syst... 
Format            Method     static string Format(type enumType, System.... 
GetName           Method     static string GetName(type enumType, System... 
GetNames          Method     static System.String[] GetNames(type enumType) 
GetUnderlyingType Method     static type GetUnderlyingType(type enumType) 
GetValues         Method     static array GetValues(type enumType) 
IsDefined         Method     static bool IsDefined(type enumType, System... 
Parse             Method     static System.Object Parse(type enumType, s... 
ReferenceEquals   Method     static bool ReferenceEquals(System.Object o... 
ToObject          Method     static System.Object ToObject(type enumType... 
PS> [Enum]::GetValues([System.Environment+SpecialFolder]) 
Desktop 
Programs 
Personal 
Personal 
Favorites 
Startup 
Recent 
SendTo 
StartMenu 
MyMusic 
DesktopDirectory 
MyComputer 
Templates 
ApplicationData 
LocalApplicationData 
InternetCache 
Cookies 
History 
CommonApplicationData 
System 
ProgramFiles 
MyPictures 
CommonProgramFiles 

PS> foreach ($f in [Enum]::GetValues([System.Environment+SpecialFolder])) { 
>> "{0,-20} - {1}" -f $f, [Environment]::GetFolderPath($f) } 
>> 
Desktop              - C:\Users\jsnover\Desktop 
Programs             - C:\Users\jsnover\AppData\Roaming\Microsoft\Windows\S 
tart Menu\Programs 
Personal             - C:\Users\jsnover\Documents 
Personal             - C:\Users\jsnover\Documents 
Favorites            - C:\Users\jsnover\Favorites 
Startup              - C:\Users\jsnover\AppData\Roaming\Microsoft\Windows\S 
tart Menu\Programs\Startup 
Recent               - C:\Users\jsnover\AppData\Roaming\Microsoft\Windows\R 
ecent 
SendTo               - C:\Users\jsnover\AppData\Roaming\Microsoft\Windows\S 
endTo 
StartMenu            - C:\Users\jsnover\AppData\Roaming\Microsoft\Windows\S 
tart Menu 
MyMusic              - C:\Users\jsnover\Music 
DesktopDirectory     - C:\Users\jsnover\Desktop 
MyComputer           - 
Templates            - C:\Users\jsnover\AppData\Roaming\Microsoft\Windows\T 
emplates 
ApplicationData      - C:\Users\jsnover\AppData\Roaming 
LocalApplicationData - C:\Users\jsnover\AppData\Local 
InternetCache        - C:\Users\jsnover\AppData\Local\Microsoft\Windows\Tem 
porary Internet Files 
Cookies              - C:\Users\jsnover\AppData\Roaming\Microsoft\Windows\C 
ookies 
History              - C:\Users\jsnover\AppData\Local\Microsoft\Windows\His 
tory 
CommonApplicationData - C:\ProgramData 
System               - C:\Windows\system32 
ProgramFiles         - C:\Program Files 
MyPictures           - C:\Users\jsnover\Pictures 
CommonProgramFiles   - C:\Program Files\Common Files

Это круто или нет?

Наслаждайтесь!

Джеффри Сновер (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

Перевод: Илья Лушников