使用 Powershell 编辑/设置 Mime 类型?

使用 Powershell 编辑/设置 Mime 类型?

所以我想知道是否有一种特定的方法可以使用 powershell 更改/编辑 IIS 7.5 中的 mime 类型?

到目前为止,我已经遇到了添加 mimetype 的解决方案,例如: http://sclarson.blogspot.co.at/2011/08/adding-mime-type-to-iis-vis-powershell.html http://forums.iis.net/t/1192371.aspx 还有一些其他书籍引用了这些内容,但这些书籍中没有包含任何相关信息,我检查了一下。

似乎使用Add-WebConfigurationProperty了,但是当我对现有的 mimetype 使用此方法时,我将收到与重复的项目条目相关的错误(因为它已经在那里),所以这种方法不适用。

我尝试使用Set-WebConfigurationProperty,但结果却删除了所有现有的 mimetype 条目,只留下其中一个。

那么有人有什么建议或者知道正确的方法吗?我也考虑过先删除条目然后添加它,唯一的问题是你需要知道 mimetype fileExtension 和 mimeTypes(即 text/XML 等)。所以我假设我需要先使用该getwebconfigproperty方法获取两个属性,然后通过将其中的值解析到delete-webpropconfig函数中来删除它,然后添加它……但仅仅为了设置 mimetype 就进行三个步骤似乎有点过分了。

据我所知,appcmd.exe 设置配置“此处的值和参数”方法几乎可以直接完成此操作。但问题是,不幸的是我们不能使用它。是的,我知道我可以让 powershell 执行 appcmd 命令,但不幸的是这不是一个可行的选择。我尝试过在谷歌上搜索和阅读书籍来寻找解决方案,但到目前为止还没有找到原因的答案

1)该set-webconfigurationproperty方法删除所有其他 mimetype 条目

2)add-webconfigurationproperty不允许我执行它并抛出“错误重复”消息

3)使用 powershell 在一行中完成此操作的有效解决方案。

答案1

唯一似乎有效的是这个:

& $Env:WinDir\system32\inetsrv\appcmd.exe set config /section:staticContent /-"[fileExtension='.eml']"
& $Env:WinDir\system32\inetsrv\appcmd.exe set config /section:staticContent /+"[fileExtension='.eml',mimeType='application/octet-stream']"

所以我采用了这种方法,正如前面提到的,任何类型的 set-webconfiguration 命令都只是覆盖了 IIS mimetype 菜单中的整个 mimetype 列表。

希望这对将来的某人有所帮助

答案2

我知道这个问题很老了,而且已经得到解答了,但我想为新观众补充一些内容。已在 上测试IIS 8.5 Windows Server 2012R2。不幸的是,我无法访问 IIS 7.5。

使用 .zip 扩展名作为示例文件扩展名

添加新的 MIME 类型:

Add-WebConfigurationProperty -PSPath 'MACHINE/WEBROOT/APPHOST' -Filter "system.webServer/staticContent" -Name "." -Value @{ fileExtension='.zip'; mimeType='application/x-zip-compressed' }

编辑现有的 MIME 类型:

Set-WebConfigurationProperty -PSPath 'MACHINE/WEBROOT/APPHOST' -Filter "system.webServer/staticContent/mimeMap[@fileExtension='.zip']" -Name "fileExtension" -Value ".example"

删除现有的 MIME 类型:

Remove-WebConfigurationProperty  -PSPath 'MACHINE/WEBROOT/APPHOST' -Filter "system.webServer/staticContent" -Name "." -AtElement @{ fileExtension= '.zip' }

读取/获取现有的 MIME 类型:

$getSetting = Get-WebConfigurationProperty -PSPath 'MACHINE/WEBROOT/APPHOST' -Filter "system.webServer/staticContent" -Name "."
$getSetting.Collection | Where-Object { $_.fileExtension -eq ".zip"}
#OR
Get-WebConfigurationProperty -PSPath 'MACHINE/WEBROOT/APPHOST' -Filter "system.webServer/staticContent" -Name "." | Where-Object { $_.fileExtension -eq ".zip"}

答案3

您可以使用Set-WebConfigurationProperty,但必须在 XPath 过滤器中指定要更改的 mimetype。

例如以下命令将更改文件扩展名为“.currentExt“ 到 ”.changedExt“在 IIS 服务器使用的根 web.config 中:

Set-WebConfigurationProperty -Filter "//staticContent/mimeMap[@fileExtension='.currentExt']" -PSPath IIS:\ -Name fileExtension -Value ".changedExt"

mimeMap在XPath中使用是因为application.host.config的结构如下:

<staticContent lockAttributes="isDocFooterFileName">
   <mimeMap fileExtension=".323" mimeType="text/h323" />
   <mimeMap fileExtension=".aaf" mimeType="application/octet-stream" />
   <mimeMap fileExtension=".aca" mimeType="application/octet-stream" />
   ...
</staticContent>

我假设你正在修改建议的代码http://sclarson.blogspot.co.at/2011/08/adding-mime-type-to-iis-vis-powershell.html尝试使用 修改 mimeTypes 时Set-WebConfigurationProperty。在链接中的代码上使用以下修改时,所有 mimeTypes 都被覆盖的原因是

set-webconfigurationproperty //staticContent -name collection -value @{fileExtension='.otf'; mimeType='application/octet-stream'} 

是因为整个 mimeTypes 集合被一个条目替换了。

答案4

如果您不能使用appcmd,并且set-webconfigurationproprty不起作用,也许自定义函数可以起作用?

获取 COM DLL“Interop.IISOle.dll”并将其放在容易引用的地方(例如,在虚拟项目中引用 COM 组件“Active DS IIS Namespace Provider”,从 bin 文件夹中构建并获取 DLL)

function AddMimeType ([string] $websiteId, [string] $extension, [string] $application)
{
    [Reflection.Assembly]::LoadFile("yourpath\Interop.IISOle.dll") | Out-Null;
    $directoryEntry = New-Object System
                      .DirectoryServices
                      .DirectoryEntry("IIS://localhost/W3SVC/$websiteId/root");
    try {
        $mimeMap = $directoryEntry.Properties["MimeMap"]
        $mimeType = New-Object "IISOle.MimeMapClass";
        $mimeType.Extension = $extension
        $mimeType.MimeType = $application
        $mimeMap.Add($mimeType)
        $directoryEntry.CommitChanges()
        } 
    finally {
        if ($directoryEntry -ne $null) {
            if ($directoryEntry.psbase -eq $null) {
                $directoryEntry.Dispose()
            } else {
                $directoryEntry.psbase.Dispose()
            }
        }
    }
}

AddMimeType "123456" ".pdf" "application/pdf"

参考:该问题的可接受答案如何使用 PowerShell 在 IIS 网站中设置 Mime 类型?

相关内容