Мне интересно, может ли кто-нибудь объяснить мне разницу в поведении, которую я наблюдаю.
Я пытаюсь найти физический путь к сайту IIS.
Этот пример работает, корректно возвращая PhysicalPath
Import-Module WebAdministration
Get-ChildItem iis:\\sites | Select PhysicalPath
Этот пример не работает. PhysicalPath возвращается как ноль / пустой.
Get-IISSite | select PhysicalPath
Если я прав, оба образца должны возвращать объект Microsoft.Web.Administration.Site
. Почему у второго отсутствуют данные?
Посмотрим:
Get-ChildItem iis: \ sites | get-Member | Где имя -подобный р * | Имя объекта сортировки
TypeName: System.Object
Name MemberType Definition
---- ---------- ----------
password NoteProperty string password=
physicalPath NoteProperty string physicalPath=C:\inetpub\wwwroot
PSChildName NoteProperty string PSChildName=Default Web Site
PSDrive NoteProperty PSDriveInfo PSDrive=IIS
PSIsContainer NoteProperty bool PSIsContainer=True
PSParentPath NoteProperty string PSParentPath=WebAdministration::\\SANKNIGHT\Sites
PSPath NoteProperty string PSPath=WebAdministration::\\SANKNIGHT\Sites\Default Web Site
PSProvider NoteProperty IIsProviderInfo PSProvider=WebAdministration
Get-IISSite | get-Member
TypeName: Microsoft.Web.Administration.Site
Name MemberType Definition
---- ---------- ----------
ApplicationDefaults Property Microsoft.Web.Administration.ApplicationDefaults ApplicationDefault...
Applications Property Microsoft.Web.Administration.ApplicationCollection Applications {get;}
Attributes Property Microsoft.Web.Administration.ConfigurationAttributeCollection Attri...
Bindings Property Microsoft.Web.Administration.BindingCollection Bindings {get;}
ChildElements Property Microsoft.Web.Administration.ConfigurationChildElementCollection Ch...
Delete Method void Delete()
у него нет членов, начинающихся с P, и гораздо меньше членов, чем Get-ChildItem. Вы можете видеть, что это не один и тот же объект.
При использовании Get-ChildItem каждый провайдер дает некоторые подсказки о том, что следует отображать. Я думаю, что это находится в:
$ pshome \ Modules \ WebAdministration \ iisprovider.format.ps1xml
, поэтому вся дополнительная информация добавляется.
Вышеупомянутый ответ верен, но он казался запутанным, чтобы добраться до него. Короче говоря, они возвращают разные типы объектов.
Надеюсь, это лучше иллюстрирует:
$PSDriveThing = Get-ChildItem IIS:\Sites\
$IISSiteThing = Get-IISSite
Оба объекта являются массивами, но их содержимое сильно различается, и возвращаемый объект get-iisSite
не отображает объект PhysicalPath на верхнем уровне. Поэтому, когда вы выбираете
для чего-то, чего не существует, вы создаете пустой массив.
> $PSDriveThing
physicalPath
------------
%SystemDrive%\inetpub\wwwroot
D:\web\OurPortalWeb\site
> $IISSiteThing
PhysicalPath
------------
Теперь вместо этого получите фактические объекты IIS:
> $IISSiteThing = Get-IISSite
> $IISSiteThing
Name ID State Physical Path Bindings
---- -- ----- ------------- --------
Default Web Site 1 Stopped %SystemDrive%\inetpub\wwwroot http *:80:
net.msmq localhost
msmq.formatname localhost
net.pipe *
OurPortalWeb 2 Started D:\web\OurPortalWeb\site https *:443:portal-test2.contoso.com sslFlags=None
Есть два сайта, значит, два объекта, поэтому мы возьмем первый с индексом массива 0:
>$IISSiteThing[0]
Name ID State Physical Path Bindings
---- -- ----- ------------- --------
Default Web Site 1 Stopped %SystemDrive%\inetpub\wwwroot http *:80:
net.msmq localhost
msmq.formatname localhost
net.pipe *
net.tcp 808:*
И по мере того, как вы детализируете объект, вы найти множество подузлов и информации в Microsoft.Web.Administration.ConfigurationElement
, пока в конце концов вы не обнаружите, что хотите:
> $IISSiteThing[0].Applications[0].VirtualDirectories[0].PhysicalPath
%SystemDrive%\inetpub\wwwroot
Один из способов получить только физические пути по своему усмотрению:
> Get-IISSite | % {$_.Applications} | % {$_.VirtualDirectories} | % {$_.PhysicalPath}
%SystemDrive%\inetpub\wwwroot
D:\web\OurPortalWeb\site