Спасибо всему, что ответило! Я попробовал все решения, представленные здесь, и я сделал больше поиска в Интернете для других возможных решений, и я думаю, что нашел тот, который это обещает:
tr.top td {
border-top: thin solid black;
}
tr.bottom td {
border-bottom: thin solid black;
}
tr.row td:first-child {
border-left: thin solid black;
}
tr.row td:last-child {
border-right: thin solid black;
}
<html>
<head>
</head>
<body>
<table cellspacing="0">
<tr>
<td>no border</td>
<td>no border here either</td>
</tr>
<tr class="top row">
<td>one</td>
<td>two</td>
</tr>
<tr class="bottom row">
<td>three</td>
<td>four</td>
</tr>
<tr>
<td colspan="2">once again no borders</td>
</tr>
<tr class="top bottom row">
<td colspan="2">hello</td>
</tr>
<tr>
<td colspan="2">world</td>
</tr>
</table>
</body>
</html>
Вывод:
Вместо того, чтобы иметь необходимость добавить top
, bottom
, left
, и right
классы к каждому <td>
, все, что я должен сделать, добавляют top row
к вершине <tr>
, bottom row
к нижней части <tr>
, и row
к каждому <tr>
промежуточный. Есть ли что-то не так с этим решением? Есть ли какие-либо межплатформенные проблемы, о которых я должен знать?
Мне нравится. Единственное, что я бы изменил, - это использовать больше функций Powershell вместо хрупких предположений. Например:
используйте Join-Path вместо конкатенации строк
используйте поставщика Env: \
для поиска каталога % programfiles (x86)%
(или еще лучше, используйте поставщик HKML: \
, чтобы найти путь - он находится в SOFTWARE \ Microsoft \ VisualStudio \\ InstallDir)
, когда мне нужно написать строку, содержащую буквальные двойные кавычки и переменную расширения, я обычно прибегаю к синтаксису ниже. Очевидно, личные предпочтения.
'"{0}" "{1}" / build "{2}"' -f $ devenv, $ solutionPath, $ releaseProfile
В некоторых случаях я был бы склонен использовать Process.Start (), чтобы я мог независимо захватывать потоки stdout и stderr (и, возможно, даже управлять stdin в интерактивном режиме, в зависимости от приложения).
PS - ' & 'не обязательно.
Я думаю, что это не нужно использовать здесь Invoke-Expression. Я сделал это с большим количеством скриптов сборки, и обычно это выглядит так:
$vsroot = "$env:ProgramFiles(x86)\Microsoft Visual Studio 9.0"
$devenv = "$vsroot\Common7\IDE\devenv.exe"
$sln = Join-Path <source_root> Source\MyProj\MyProj.sln
& $devenv $sln /build Release
или
& $devenv $sln /build "Release|Any CPU"
Хотя в последнее время у меня были проблемы с использованием devenv.exe (некорректные надстройки и т. Д.), Поэтому теперь я использую msbuild.exe:
$msbuild = 'C:\Windows\Microsoft.NET\Framework\v3.5\MSBuild.exe'
& $msbuild $sln /p:Configuration=Release
В настоящее время MSBuild может обрабатывать C #, VB и C ++ (вызывает vcbuild), но не может обрабатывать решения с проектами установки и развертывания в них. Однако я обнаружил, что это более надежно, чем использование devenv.exe.
Кстати, вам обычно нужно вызывать другие инструменты (sn.exe, signtool.exe, mt.exe и т. Д.) В сценарии сборки, специфичные для версия Visual Studio / .NET, с которой вы хотите работать. Поэтому обычно лучше настраивать переменные среды так же, как это делает командная строка VS 2008. Установив PowerShell Community Extensions , вы можете включить одну строку в заголовке профиля PSCX, чтобы включить это для настроек .NET 3.5 / VS 2008:
$Pscx:Preferences["ImportVisualStudioVars"] = $true