每次我执行这个命令
invoke-command -computername REMOTEPC -scriptblock { import-module WebAdministration; new-item "$env:systemdrive\inetpub\testsite" -type directory; New-WebSite -Name TestSite -Port 81 -PhysicalPath "$env:systemdrive\inetpub\testsite" }
我收到以下错误
Invalid class string (Exception from HRESULT: 0x800401F3 (CO_E_CLASSSTRING))
+ CategoryInfo : NotSpecified: (:) [Get-ChildItem], COMException
+ FullyQualifiedErrorId : System.Runtime.InteropServices.COMException,Microsoft.PowerShell.Commands.GetChildItemCommand
据我所知,该网站已成功创建。
以下命令在枚举测试站点时给出相同的错误
Invoke-Command -computername REMOTEPC { import-module webadministration; dir -path IIS:\Sites\ }
Name ID State Physical Path Bindings PSComputerName
Default Web Site 1 Started http *:80: REMOTEPC
Invalid class string (Exception from HRESULT: 0x800401F3 (CO_E_CLASSSTRING))
+ CategoryInfo : NotSpecified: (:) [Get-ChildItem], COMException
+ FullyQualifiedErrorId : System.Runtime.InteropServices.COMException,Microsoft.PowerShell.Commands.GetChildItemCo
mmand
任何建议,将不胜感激
答案1
这是一个序列化问题。协议New-WebSite
中的 和顶级 WebSite 信息IIS:\Sites\{sitename}
都返回 类型的对象Microsoft.IIs.PowerShell.Framework.Configuration
。该对象包含属性ftpServer
;并且ftpServer
不可序列化。
New-WebApplication
并且来自协议的 Sub-WebApplication 信息IIS:\Sites\{siteName}\{subappname}
没有ftpServer
属性。它们不会出现相同的序列化错误。
@cad 的解决方案很棒,因为它可以阻止远程脚本返回任何对象。
但是,如果您想从远程机器返回网站信息,您可以使用:
$scriptBlock = {
Import-Module WebAdministration
$site = Get-Item IIS:\Sites\www.sitename.com
$site.ftpServer = $null # this won't affect the real server value
return $site
}
Invoke-Command -ComputerName REMOTEPC -ScriptBlock $scriptBlock
答案2
我遇到了和你一样的问题。我在一个迭代中尝试创建 16 个站点。第一个站点正在创建,但出现了同样的异常...退出迭代,只留下一个站点创建。我没有修复它,但作为一个解决方法我补充道
| 出空
在行尾。这抑制了输出,因此异常被忽略,并且我的迭代顺利地继续。
就像是:
invoke-command -computername REMOTEPC -scriptblock { import-module WebAdministration; new-item "$env:systemdrive\inetpub\testsite" -type directory; New-WebSite -Name TestSite -Port 81 -PhysicalPath "$env:systemdrive\inetpub\testsite" | out-null}
(请注意代码片段末尾的 | out-null)