Исследуйте Вашу среду [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
Перевод: Илья Лушников
Comments
- Anonymous
January 01, 2003
В моем недавнем посте Исследуйте вашу среду [Environment] я сказал следующее: PS> [System.Environment+SpecialFolder]