我想知道是否有人可以向我解释我所看到的行为的差异。
我正在尝试查找 IIS 站点的物理路径。
此示例有效,正确返回 PhysicalPath
Import-Module WebAdministration
Get-ChildItem iis:\\sites | Select PhysicalPath
此示例不起作用。PhysicalPath 返回为 null/空。
Get-IISSite | select PhysicalPath
如果我没记错的话,两个示例都应该返回一个Microsoft.Web.Administration.Site
对象。为什么第二个示例缺少数据?
答案1
让我们来看看:
Get-ChildItem iis:\sites | get-Member | 其中名称 -like p* | Sort-Object 名称
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
获取 IISSite | 获取成员
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
因此,所有额外信息均被添加。
答案2
上述答案是正确的,但似乎有些复杂。更简短的答案是它们返回不同的对象类型。
希望这可以更好地说明这一点:
$PSDriveThing = Get-ChildItem IIS:\Sites\
$IISSiteThing = Get-IISSite
这两个对象都是数组,但内容却大不相同,并且get-iisSite
返回的对象不会在顶层显示 PhysicalPath 对象。因此,当您select
查找不存在的内容时,您将创建一个空数组。
> $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