1

我正在使用 PowerShell v3.0 和IIS 管理 Cmdlet从我的 IIS 7 实例中添加和删除网站。我使用Import-Module WebAdministration来确保 IIS: 驱动器可用,并且我可以使用 Remove-Item 通过 IIS: 驱动器删除文件。出于某种原因,尽管当我使用以下代码时,Split-Path 总是返回一个空字符串,即使 Remove-Item 工作正常。

$iisPath = Join-Path "IIS:\Sites" $fullPath
Remove-Item -Path $iisPath
$parent = Split-Path -Path $iisPath -Parent

即使我注释掉 Remove-Item 行,Split-Path 仍然返回一个空字符串。$iisPath 值看起来像这样:

IIS:\Sites\Application Services\2.5.12\OurProductServicesDirectory

所以我希望 $parent 包含:

IIS:\Sites\Application Services\2.5.12

但是 $parent 总是空的。我也尝试使用$iisPath = "IIS:\Sites\$fullPath"而不是 Join-Path 创建 $iisPath,但仍然得到相同的结果。

任何想法为什么在使用 IIS: 驱动器时拆分路径似乎不起作用,或者如何修复它?

===更新===

所以我创建了一个很小的示例脚本来看看我是否可以重现这个问题。这里是:

$Block = {
    Import-Module WebAdministration
    $path = "IIS:\Sites\Application Services\2.5.12\OurProductServicesDirectory\"
    Test-Path -Path $path
    $parent = Split-Path -Path $path -Parent
    Write-Host Parent is $parent
}

$Session = New-PSSession -ComputerName "Our.WebServer.local"
Invoke-Command -Session $Session -ScriptBlock $Block

使用此脚本 $parent 确实会获得一个值,但写入控制台的文本是:

True
Parent is IIS:Sites\Application Services

当我期望它是:

True
Parent is IIS:\Sites\Application Services\2.5.12

所以在我的简单示例脚本中,我确实得到了一个值,但它是错误的值;它返回祖父目录而不是父目录,并从IIS:之后删除反斜杠。

我不确定为什么我在这个示例脚本中得到不同的结果,然后在我的主脚本中得到不同的结果,但两个结果似乎都是错误的。任何建议表示赞赏。

4

1 回答 1

0

因此,由于 IIS: 限定符通过导入 WebAdministration 模块而有效,我将假设 Split-Path 根本没有设计为与 IIS: 限定符一起使用,这就是它不能正确处理它的原因。

我发现的解决方法只是在使用拆分路径时从我的路径中排除IIS:\Sites\ 。所以我原来的例子会变成:

Remove-Item -Path "IIS:\Sites\$fullPath"
$parent = Split-Path -Path $fullPath -Parent

所以基本上我只是将IIS:\Sites\从我的所有路径中移除,然后在需要时显式添加它,例如在调用 Remove-Item、Test-Path、Get-ChildItems 等时。这不是最好的解决方案,但它作品。

于 2013-10-23T19:56:05.823 回答