所以我想知道是否有一种特定的方法可以使用 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 类型?