среда, 18 декабря 2013 г.

Разрастание кэша TFS на сервере

У вас на сервере TFS могут возникать проблемы с местом из-за разрастания кэша TFS, который хранится в папке:
  • TFS 2012 - C:\Program Files\Microsoft Team Foundation Server 11.0\Application Tier\Web Services\_tfs_data
  • TFS 2013 - C:\Program Files\Microsoft Team Foundation Server 12.0\Application Tier\Web Services\_tfs_data
Для того, чтобы кэш не разрастался больше фиксированного объёма, необходимо сконфигурировать файл web.config (для TFS 2013 находится в папке C:\Program Files\Microsoft Team Foundation Server 12.0\Application Tier\Web Services).

Внесите в раздел <appSettings> элемент:
 <add key="FixedSizeBasedPolicy" value="NNN" /> 
где NNN - количество мегабайт, больше которого кэш не должен разрастаться.

Например, если вы хотите, чтобы кэш не разрастался более 500 Мб, у вас должно быть:
...
<appSettings>
...
 <add key="FixedSizeBasedPolicy" value="500" /> 
...
</appSettings>


вторник, 19 ноября 2013 г.

Оповещение о создании/удалении баз данных на MS SQL Server

USE master;
GO

CREATE TRIGGER [os_Trigger_Notification_CreateDrop_Database
ON ALL SERVER FOR CREATE_DATABASE, DROP_DATABASE 
AS 
declare @results varchar(max)
declare @subjectText varchar(max)
declare @subjectBegin varchar(255) 
declare @databaseName VARCHAR(255)
BEGIN
SET NOCOUNT ON;
SET @results = (SELECT EVENTDATA().value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]','nvarchar(max)'))
SET @databaseName = (SELECT EVENTDATA().value('(/EVENT_INSTANCE/DatabaseName)[1]', 'VARCHAR(255)'))
SET @subjectBegin = 'Создана'
IF (LEFT(@results,4) = 'DROP') SET @subjectBegin = 'Удалена'
SET @subjectText = @subjectBegin + ' база данных на сервере ' + @@SERVERNAME + ' пользователем ' + SUSER_SNAME() 

EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'MailProfile',
@recipients = 'user@example.ru',
@body = @results,
@subject = @subjectText;

END


Для удаления триггера используйте:
DROP TRIGGER [os_Trigger_Notification_CreateDrop_Database] ON ALL SERVER; 
GO


понедельник, 18 ноября 2013 г.

TFS Planning Guide

Обязательный к прочтению для администратора TFS: http://vsarplanningguide.codeplex.com/

среда, 13 ноября 2013 г.

Перенос базы TempDB в новое место

USE master
ALTER DATABASE tempdb MODIFY FILE(Name = tempdb, Filename = N'C:\NewFolder\tempdb.mdf')
GO

ALTER DATABASE tempdb MODIFY FILE(Name = templog, Filename = N'C:\NewFolder\templog.ldf')
GO

Если необходимо добавить файлы данных для базы TempDB (учитывая рекомендации в соответствии с количеством процессоров):

ALTER DATABASE tempdb
ADD FILE (NAME = tempdev2, FILENAME = 'C:\NewFolder\tempdb2.mdf', SIZE = 256);
ALTER DATABASE tempdb
ADD FILE (NAME = tempdev3, FILENAME = 'C:\NewFolder\tempdb3.mdf', SIZE = 256);
ALTER DATABASE tempdb
ADD FILE (NAME = tempdev4, FILENAME = 'C:\NewFolder\tempdb4.mdf', SIZE = 256);
GO

вторник, 12 ноября 2013 г.

HammerDB - оценка производительности SQL-сервера

HammerDB (бывший Hammerora) - бесплатный инструмент, позволяет проводить TPC-подобные тесты (TPC-C и TPC-H) различных СУБД: Oracle, Microsoft SQL Server, PostgreSQL, Greenplum, MySQL и Redis.



воскресенье, 10 ноября 2013 г.

Сценарий восстановления базы данных с помощью параметра REPAIR_ALLOW_DATA_LOSS

ps: перед использованием обязательно проконсультироваться с врачом прочитать MSDN.
ps2: не рекомендую использовать это в боевой системе без соответствующих знаний, чтобы не нанести вред.

USE [ИмяБазыДанных]

-- 1 шаг. Проверка базы на ошибки

DBCC CHECKDB([ИмяБазыДанных])

-- 2 шаг. Перевод базы в монопольный режим

ALTER DATABASE [ИмяБазыДанных] SET SINGLE_USER WITH ROLLBACK IMMEDIATE

-- 3 шаг. Перевод базы в аварийных режим

ALTER DATABASE [ИмяБазыДанных] SET emergency

-- 4 шаг. Восстановление базы

DBCC CHECKDB([ИмяБазыДанных], REPAIR_ALLOW_DATA_LOSS)

-- 5 шаг

ALTER DATABASE [ИмяБазыДанных] SET multi_user

суббота, 9 ноября 2013 г.

Обслуживание TFS

1. В первую очередь...
  • Применяйте все обновления безопасности. Используйте инструмент MBSA (http://go.microsoft.com/fwlink/?linkid=20567). Критические обновления безопасности должны применяться в течении 48 часов. 
  • Используйте последнюю версию TFS.
  • Используйте последнюю версию SQL.
  • Используйте последнюю версию ОС.
  • Используйте последние версии драйверов оборудования (особенно NIC и SAN/HBA драйвера).
2. Настройка ОС и регулярные задачи
  • Соберите все данные с базовых счётчиков производительности, чтобы выявить узкие места. В будущем это также послужит полезным инструментом диагностики. Необходимо собрать данные счётчиков в рабочий день в течении 24 часов с интервалом 1-5 мин. Не знаете какие счётчики собирать? Используйте инструмент PAL (http://pal.codeplex.com/) с шаблонами "System Overview" and "SQL Server".
  • Обеспечите антивирусные исключения для TFS, SQL и SharePoint (http://support.microsoft.com/kb/2636507
  • Обеспечите корректные правила для Firewall.
  • Убедитесь, что настроен полный дамп памяти (http://support.microsoft.com/kb/254649). При сбое это существенно повысит ваши шансы на исправление причины неполадки. Используйте NotMyFault.exe для создания дампа вручную (http://support.microsoft.com/kb/969028).
  • Не запускайте SQL и TFS под учётной записью локального администратора.
3. Настройка SQL
4. Регулярное обслуживание SQL
5. Настройка TFS
  • Иметь не меньше 2 App-tier (серверов приложений) в NLB. Это позволит вам использовать 2 job-агента для запуска фоновых заданий TFS, выполнять больше запросов/сек. Убедитесь, что NLB имеет TCP Idle timeout в 60 минут и все ваши клиенты используют последнюю версию. См. http://blogs.msdn.com/b/granth/archive/2013/02/13/tfs-load-balancers-idle-timeout-settings-and-tcp-keep-alives.aspx
  • Включите SQL Page Compression для таблиц кроме tbl_Content. Для включения используйте действия, обратные KB2712111.
  • Убедитесь, что включено секционирование таблиц для Version Control. Не рекомендуется, если у вас >1 млн. строк в tbl_LocalVersion. Обратитесь в службу поддержки MS т.к. это недокументированная возможность только для самых больших TFS instances (например, для DevDiv).
  • Проверьте, что SOAP gzip compression включена (http://blogs.msdn.com/b/granth/archive/2010/05/09/tfs2010-how-to-enable-compression-for-soap-traffic.aspx)
  • Отключить log-файлы IIS, чтобы они не заполнили диск: %windir%\system32\inetsrv\appcmd set config -section:system.webServer/httpLogging /dontLog:"True"  /commit:apphost
  • Изменить TFS App Pool Idle Timeouts с 20 до 0 минут (нет тайм-аута) и отключить scheduled recycling чтобы не было остановок в рабочие часы. 
  • Запустить TFS Proxy Server и убедиться, что сотрудники используют его (особенно build-сервер). Даже если не будет удалённых пользователей, это всеравно увеличит количество обрабатываемых запросов (request/sec) на App-tier. Сконфигурируйте его как прокси-сервер по умолчанию для сайта: tf proxy /add
  • При необходимости включить work item tracking metadata filtering.
  • Проверить корректность работы SMTP (SMTP settings). Наиболее распространённой проблемой здесь является ..
  • Установите NotificationJobLogLevel = 2 (http://blogs.msdn.com/b/granth/archive/2009/10/28/tfs2010-diagnosing-email-and-soap-subscription-failures.aspx) чтобы получать подробное сообщение об ошибке (например, используя TFS Best Practice Analyzer из TFS Power Tools)
  • Перенести кеш TFS на отдельный физический и/или логический диск. Как это сделать - http://msdn.microsoft.com/en-us/library/vstudio/ms400793.aspx. Во-первых, снизить нагрузку на систему ввода/вывода. Во-вторых, если вы восстановите базу данных на более ранний момент времени, вам необходимо будет очистить кеш TFS, иначе пользователям будет выдаваться неправильный контент. Если кеш TFS будет на отдельном диске, сделать это можно будет очень быстро. 
6. Регулярное обслуживание TFS
  • Проводите регулярные проверки с помощью TFS Best Practice Analyzer из пакета TFS Power Tools. Это поможет вам выявить проблемы, которые присутствуют на вашем сервере TFS.
  • Периодически просматривайте Activity Log и Job Monitoring в панели управления вашего сервера TFS - http://ServerName:8080/tfs/_oi/. В Activity Log вы можете просмотреть последние действия пользователей на сервере TFS. В Job Monitoring вы увидите успешно ли выполняются сервисные задания TFS-агента. 
  • Установите Performance Report Pack для просмотра пользователей, которые больше всех нагружают TFS. Также, анализируйте таблицу TFS-коллекции - tbl_Command.
  • Используйте Test Attachment Cleaner Tools (см. http://geekswithblogs.net/terje/archive/2011/11/15/guide-to-reduce-tfs-database-growth-using-the-test-attachment.aspx) для очистки таблицы tbl_Content.
  • Очищайте неиспользуемые workspaces и shelvesets. Используйте Team Foundation Sidekicks. Команда: tf workspace /delete.
  • Удаление полей, которые не используются (witadmin listfields /collection:http://tfs:8080/tfs/Collection /unused).
  • Проверяйте здоровье куба и warehouse с помощью Admin Report pack.
  • Проанализируйте поля со свойством reportingtype=’dimension’. Действительно ли они должны находится в кубе? Если нет, то поменяйте значение на 'detail' и при необходимости вызывайте их с помощью базы данных Tfs_Warehouse
  • Проанализируйте запросы на использование полей. Возможно, необходимо проиндексировать некоторые поля (witadmin indexfield /index:on) для увеличения быстродействия.
  • Проверьте tbl_EventSubscriptions на наличие невалидных получателей (email). Для удаления подписок используйте TFS Web Access "All Alerts" - http://yourserver:8080/tfs/YourCollection/YourProject/admin/_alerts
Первоисточник: http://blogs.msdn.com/b/granth/archive/2013/10/08/what-does-a-well-maintained-team-foundation-server-look-like.aspx

вторник, 29 октября 2013 г.

Тест дисковой подсистемы SQL-сервера с помощью SQLIO

Дисковую подсистему сервера с СУБД SQL Server рекомендуется тестировать с помощью утилиты SQLIO (http://www.microsoft.com/en-us/download/details.aspx?id=20163).


понедельник, 28 октября 2013 г.

Тест процессора для SQL-сервера с помощью Geekbench

Для тестирования производительности процессора сервера с СУБД SQL Server рекомендуется использовать утилиту Geekbench (http://www.primatelabs.com/geekbench/).

Помимо количественных показателей различных тестов процессора утилита выдаёт общий балл производительности процессора.

В итоге, вы увидите следующую информацию..






Утилита также запускается и в консольном варианте.



пятница, 20 сентября 2013 г.

TFS 2012: Права доступа уровня проекта

Разрешения уровня проекта применяются к пользователям и группам отдельного проекта. Чтобы настроить эти разрешения, выберите проект в Team Explorer, выберите меню Параметры, а затем выберите Безопасность, либо откройте Team Web Access в режиме администрирования, перейдите к уровню проекта, а затем выберите вкладку Безопасность. Данные разрешения также можно настроить с помощью служебной программы командной строки TFSSecurity.





  • Создать запуск тестов (Create test runs)
  • Пользователи с данным разрешением могут добавлять и удалять результаты тестов, а также добавлять или изменять тестовые запуски для командного проекта.
    TFSSecurity: PUBLISH_TEST_RESULTS
  • Удалить проект (Delete team project)
  • Пользователи с данным разрешением могут удалять проект, для которого у них есть данное разрешение из Team Foundation Server.
    TFSSecurity: DELETE
  • Удалить запуск тестов (Delete test runs)
  • Пользователи, имеющие это разрешение, могут удалять запланированные тесты для данного командного проекта.
    TFSSecurity: DELETE_TEST_RESULTS
  • Редактировать информацию уровня проекта (Edit project-level information)
  • Пользователи с данным разрешением могут изменять разрешения на уровне проекта для пользователей и групп в Team Foundation Server.
    TFSSecurity: GENERIC_WRITE
  • Управление конфигурациями тестов (Manage test configurations)
  • Пользователи, имеющие это разрешение, могут создавать и удалять конфигурации тестов для данного командного проекта.
    TFSSecurity: MANAGE_TEST_CONFIGURATIONS
  • Управление тестовой средой (Manage test environments)
  • Пользователи, имеющие это разрешение, могут создавать и удалять тестовые среды для данного командного проекта.
    TFSSecurity: MANAGE_TEST_ENVIRONMENTS
  • Просмотр информации уровня проекта (View project-level information)
  • Пользователи с данным разрешением могут просматривать участников групп уровня проекта, а также разрешения данных пользователей проекта.
    TFSSecurity: GENERIC_READ
  • Просмотр запусков тестов (View test runs)
  • Обладающие этим разрешением пользователи могут просматривать планы тестирования в этом узле.
    TFSSecurity: VIEW_TEST_RESULTS

вторник, 9 июля 2013 г.

Часто-используемые команды Linux

shutdown -h now - выключить систему
shutdown -r now - перезагрузка

пятница, 7 июня 2013 г.

Проблема с разрастанием кэша на TFS 2012


Иногда случается проблема с тем, что кэш TFS заполняет всё свободное пространство на диске, из-за чего останавливается сервер.

Папка по умолчанию для кэша TFS:
C:\Program Files\Microsoft Team Foundation Server 11.0\Application Tier\Web Services\_tfs_data

Для того, чтобы кэш не разрастался больше указанного размера, необходимо использовать элемент FixedSizeBasedPolicy.

В файл web.config (по умолчанию находится в папке C:\Program Files\Microsoft Team Foundation Server 11.0\Application Tier\Web Services) добавить в раздел <appSettings> текст:
<add key="FixedSizeBasedPolicy" value="500" />
где value - предельный размер кэша в мегабайтах.


После этого сохранить файл web.config и перезагрузить IIS (например, командой iisreset /noforce).

См. ссылку.

пятница, 31 мая 2013 г.

Как добавить PowerShell-модуль ActiveDirectory в Windows 7?

1. Установите Remote Server Administration Tools (RSAT) для Windows 7 (ссылка).
2. Далее, открыть Панель управления > Все элементы панели управления > Программы и компоненты.
Открыть меню справа "Включение и отключение компонентов Windows".
Пройти по дереву Средства удалённого администрирования сервера > Средства администрирования ролей > Средства доменных служб Active Directory и служб облегчённого доступа к каталогам
Включить компонент "Модуль Active Directory для Windows".



3. Всё готово.

Модуль можно запускать через командную строку PowerShell:
>> Import-Module ActiveDirectory

Для проверки корректной работы модуля запустите команду:
>> get-module -ListAvailable


Краткий список решений для частоиспользуемых сценариев работы с модулем ActiveDirectory:
  • Информация о домене:
  • >> Get-ADDomain
  • Информация о контроллере доменов:
  • >> Get-ADDomainController
  • Список администраторов:
  • >> $group = Get-AdGroup Administrators
    >> Get-ADUser -Filter {MemberOf -recursivematch $group.DistinguishedName}
  • Поиск компьютера в домене по вхождению фразы в название компьютера ("pc"):
  • >> Get-ADComputer -LDAPFilter "(name=*pc*)"
  • Более подробная информация о компьютере  чем в предыдущем командлете:
  • >> Get-ADComputer -LDAPFilter "(name=*097*)" -properties *



среда, 29 мая 2013 г.

Установка PowerShell 3.0 ISE на Windows 7

Скачать и установить Windows Management Framework 3.0.
Примечание: если не установлен, потребуется установить .Net Framework версии не ниже 4.0 (ссылка).

После этого в Пуске набрать "powershell" и запустить.

Если при запуске PowerShell-скрипта выдаётся сообщение о невозможности запуска сценария, тогда нужно поменять политику исходя из ваших предпочтений (см. about_Execution_Policies). 

Например:
>> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned

для Windows 10
>> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser



понедельник, 27 мая 2013 г.

WordPress: Локализация и перевод тем и плагинов

Для перевода английских тем или плагинов я использую плагин "CodeStyling Localization" (ссылка). С помощью него без проблем можно сделать перевод темы или плагина.

См. описание: http://www.code-styling.de/english/development/wordpress-plugin-codestyling-localization-en



четверг, 11 апреля 2013 г.

Мониторинг действий пользователей в TFS

В TFS 2012 появилась функциональность по мониторингу действий пользователей. Чтобы просмотреть эти данные, необходимо открыть Url http://ИмяСервераTFS:8080/tfs/_oi


Мониторинг пользователей

Мониторинг заданий


Раньше для мониторинга пользователей требовалось просматривать таблицу tbl_Command.


среда, 6 марта 2013 г.

Необходимые знания и навыки для сдачи экзамена MS 70-462

Аналогичный предыдущему слайд скиллов для сдачи экзамена 70-462 Administering Microsoft SQL Server 2012 Databases.



Необходимые знания и навыки для сдачи экзамена MS 70-496

Составил и отобразил в наглядной форме все скиллы, необходимые для сдачи экзамена 70-496 Administering Visual Studio Team Foundation Server 2012. Делал для себя, для сдачи экзамена, но возможно кому-то ещё пригодится.




суббота, 26 января 2013 г.

T-SQL Информация о резервных копиях для баз

Информация по резервированию для указанной базы за последние n-дней

-- Имя базы данных
DECLARE @database_name char(100) ='NameDatabase'

-- Сколько дней от текущей даты нужно анализировать
DECLARE @day int = 1

SELECT  
   CONVERT(CHAR(100), SERVERPROPERTY('Servername')) AS Server, 
   msdb.dbo.backupset.database_name as 'Database name',  
   CASE msdb..backupset.type  
       WHEN 'D' THEN 'Database'  
       WHEN 'L' THEN 'Log'  
   END AS backup_type,  
   msdb.dbo.backupset.backup_size,  
   convert(varchar, dateadd(s, datediff (s, msdb.dbo.backupset.backup_start_date, msdb.dbo.backupset.backup_finish_date), convert(datetime2, '0001-01-01')), 108) as backup_duration,  
   msdb.dbo.backupset.backup_start_date AS Start_backup,  
   msdb.dbo.backupset.backup_finish_date AS Finish_backup, 
   msdb.dbo.backupmediafamily.physical_device_name, 
   msdb.dbo.backupmediafamily.logical_device_name,       
   msdb.dbo.backupset.name AS backupset_name, 
   msdb.dbo.backupset.description,
   msdb.dbo.backupset.expiration_date AS Expiration_backup
FROM   msdb.dbo.backupmediafamily  
   INNER JOIN msdb.dbo.backupset ON msdb.dbo.backupmediafamily.media_set_id = msdb.dbo.backupset.media_set_id 
WHERE  (CONVERT(datetime, msdb.dbo.backupset.backup_start_date, 102) >= GETDATE() - @day) and msdb.dbo.backupset.database_name = @database_name
ORDER BY  
   msdb.dbo.backupset.database_name, 
   msdb.dbo.backupset.backup_finish_date desc


Информация о последней сделанной резервной копии для всех баз данных на SQL-сервере



SELECT  
   CONVERT(CHAR(100), SERVERPROPERTY('Servername')) AS Server, 
   msdb.dbo.backupset.database_name,  
   MAX(msdb.dbo.backupset.backup_finish_date) AS last_db_backup_date 
FROM   msdb.dbo.backupmediafamily  
   INNER JOIN msdb.dbo.backupset ON msdb.dbo.backupmediafamily.media_set_id = msdb.dbo.backupset.media_set_id 
 INNER JOIN sys.sysdatabases ON sys.sysdatabases.name = msdb.dbo.backupset.database_name
WHERE  msdb..backupset.type = 'D' 
GROUP BY 
   msdb.dbo.backupset.database_name  
ORDER BY  
   last_db_backup_date 



Список баз данных с количеством часов, которое прошло с последней сделанной резервной копии (базы, которые резервировались за последние 24 часа, в список не попадают)


SELECT 
   CONVERT(CHAR(100), SERVERPROPERTY('Servername')) AS Server, 
   msdb.dbo.backupset.database_name, 
   MAX(msdb.dbo.backupset.backup_finish_date) AS last_db_backup_date, 
   DATEDIFF(hh, MAX(msdb.dbo.backupset.backup_finish_date), GETDATE()) AS [Backup Age (Hours)] 
FROM  master.dbo.sysdatabases AS M LEFT JOIN msdb.dbo.backupset ON M.Name =  msdb.dbo.backupset.database_name
WHERE     msdb.dbo.backupset.type = 'D'  
GROUP BY msdb.dbo.backupset.database_name 
HAVING      (MAX(msdb.dbo.backupset.backup_finish_date) < DATEADD(hh, - 24, GETDATE()))  

UNION  

SELECT      
   CONVERT(CHAR(100), SERVERPROPERTY('Servername')) AS Server,  
   M.NAME AS database_name,  
   NULL AS [Last Data Backup Date],  
   9999 AS [Backup Age (Hours)]  
FROM 
   master.dbo.sysdatabases AS M LEFT JOIN msdb.dbo.backupset 
       ON M.name  = msdb.dbo.backupset.database_name 
WHERE msdb.dbo.backupset.database_name IS NULL AND M.name <> 'tempdb' 
ORDER BY  
   msdb.dbo.backupset.database_name


Источник: http://www.mssqltips.com/sqlservertip/1601/script-to-retrieve-sql-server-database-backup-history-and-no-backups/

четверг, 17 января 2013 г.

Настройка прогнозирования (Forecasting) в бэклоге TFS 2012

Настройка прогнозирования в бэклоге настраивается в конфиге CommonConfiguration.xml. В разделе TypeFields задаётся поле с типом "Effort".

  <TypeFields>
     ...
    <TypeField refname="Microsoft.VSTS.Scheduling.Size" type="Effort" />
    <TypeField refname="Microsoft.VSTS.Common.Discipline" type="Activity" />
    <TypeField refname="Microsoft.VSTS.Feedback.ApplicationStartInformation" type="ApplicationStartInformation" />
     ...
  </TypeFields>

Вы можете указать здесь другое поле для Forecasting.


понедельник, 14 января 2013 г.

Выгрузка конфигов (Categories, AgileProcessConfig, CommonConfiguration) с помощью PowerShell

cls
cd 'C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE'

# Указать путь к папке, куда будут выгружаться и откуда загружаться конфиги
$fld='C:\Temp'

# Указать Uri TFS коллекции
$srv='http://tfs:8080/tfs/CollectionName'

# Указать имена проектов (может быть один)
$projects=@('TFSProject1','TFSProject2')

if (!(Test-Path $fld)){
new-item -type directory -path $fld
}
    write-host '[0] - Выгрузка всех конфигов (Categories, AgileProcessConfig, CommonConfiguration)'
    write-host '-------------------------'
    write-host '[1] - Выгрузка Categories'
    write-host '[2] - Выгрузка AgileProcessConfig'
    write-host '[3] - Выгрузка CommonConfiguration'  
    write-host '-------------------------'
    write-host '[5] - Загрузка всех конфигов (Categories, AgileProcessConfig, CommonConfiguration)'  
    write-host '-------------------------'
    write-host '[6] - Загрузка Categories'
    write-host '[7] - Загрузка AgileProcessConfig'
    write-host '[8] - Загрузка CommonConfiguration'      
    $action = read-host "Выберите действие: "

# Выгрузка шаблонов
foreach ($p in $projects)
{
    write-host ' '
    write-host '---------- '            
    write-host 'Проект ' -nonewline
    write-host $p -nonewline -foregroundcolor Red
    write-host '... '
    write-host ' '      

    if ($action -eq '0')
    {    
        write-host 'Выгрузка Categories ' -nonewline
        write-host ' ' -nonewline -foregroundcolor Red
        write-host ': ' -nonewline
        .\witadmin exportcategories /collection:$srv /p:$p /f:$fld"\["$p"]_categories.xml"
        write-host 'Выгрузка AgileProcessConfig ' -nonewline
        write-host ' ' -nonewline -foregroundcolor Red
        write-host ': ' -nonewline
        .\witadmin exportagileprocessconfig /collection:$srv /p:$p /f:$fld"\["$p"]_AgileConfiguration.xml"
        write-host 'Выгрузка CommonConfiguration ' -nonewline
        write-host ' ' -nonewline -foregroundcolor Red
        write-host ': ' -nonewline
        .\witadmin exportcommonprocessconfig /collection:$srv /p:$p /f:$fld"\["$p"]_CommonConfiguration.xml"
    }
    elseif ($action -eq '1')
    {    
        write-host 'Выгрузка Categories ' -nonewline
        write-host ' ' -nonewline -foregroundcolor Red
        write-host ': ' -nonewline
        .\witadmin exportcategories /collection:$srv /p:$p /f:$fld"\["$p"]_categories.xml"
    }
    elseif  ($action -eq '2')
    {
        write-host 'Выгрузка AgileProcessConfig ' -nonewline
        write-host ' ' -nonewline -foregroundcolor Red
        write-host ': ' -nonewline
        .\witadmin exportagileprocessconfig /collection:$srv /p:$p /f:$fld"\["$p"]_AgileConfiguration.xml"
    }
    elseif  ($action -eq '3')
    {
        write-host 'Выгрузка CommonConfiguration ' -nonewline
        write-host ' ' -nonewline -foregroundcolor Red
        write-host ': ' -nonewline
        .\witadmin exportcommonprocessconfig /collection:$srv /p:$p /f:$fld"\["$p"]_CommonConfiguration.xml"
       
    }
    elseif  ($action -eq '5')
    {
        write-host 'Загрузка Categories ' -nonewline
        write-host ' ' -nonewline -foregroundcolor Red
        write-host ': ' -nonewline
        .\witadmin importcategories /collection:$srv /p:$p /f:$fld"\categories.xml"
        write-host 'Загрузка AgileProcessConfig ' -nonewline
        write-host ' ' -nonewline -foregroundcolor Red
        write-host ': ' -nonewline
        .\witadmin importagileprocessconfig /collection:$srv /p:$p /f:$fld"\AgileConfiguration.xml"                  
        write-host 'Загрузка CommonConfiguration ' -nonewline
        write-host ' ' -nonewline -foregroundcolor Red
        write-host  ': ' -nonewline
        .\witadmin importcommonprocessconfig /collection:$srv /p:$p /f:$fld"\CommonConfiguration.xml"      
    }  
   
    elseif  ($action -eq '6')
    {
        write-host 'Загрузка Categories ' -nonewline
        write-host ' ' -nonewline -foregroundcolor Red
        write-host ': ' -nonewline
        .\witadmin importcategories /collection:$srv /p:$p /f:$fld"\categories.xml"
    }
    elseif  ($action -eq '7')
    {
        write-host 'Загрузка AgileProcessConfig ' -nonewline
        write-host ' ' -nonewline -foregroundcolor Red
        write-host ': ' -nonewline
        .\witadmin importagileprocessconfig /collection:$srv /p:$p /f:$fld"\AgileConfiguration.xml"                  
    }
    elseif  ($action -eq '8')
    {
        write-host 'Загрузка CommonConfiguration ' -nonewline
        write-host ' ' -nonewline -foregroundcolor Red
        write-host  ': ' -nonewline
        .\witadmin importcommonprocessconfig /collection:$srv /p:$p /f:$fld"\CommonConfiguration.xml"
    }      
}

суббота, 12 января 2013 г.

Просмотр списка проектов в коллекции с помощью PowerShell

Cls

# Здесь указать Uri к TFS коллекции

$srv='http://tfs:8080/tfs/CollectionName

$Assem = ( 

    "Microsoft.TeamFoundation.Client, Version=11.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" , 
    "Microsoft.TeamFoundation.Common, Version=11.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"          
    ) 

$Source = @" 

using System;
using System.Collections.Generic;
using Microsoft.TeamFoundation.Client;
using Microsoft.TeamFoundation.Server;
using Microsoft.TeamFoundation.Common;
using System.Text;


namespace LP


    public class Program  
    {
        public Program()     
        {
        }
     
        public void Get(string url) 
        { 
            TfsTeamProjectCollection tfs = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(new Uri (url));
            ICommonStructureService css = (ICommonStructureService)tfs.GetService(typeof(ICommonStructureService));
            
            List<string> list = new List<string>();

            foreach (ProjectInfo projectInfo in css.ListAllProjects())

            {              
                list.Add(projectInfo.Name);                
            }

            list.Sort();

            
                foreach (string value in list)
                {
                    //Console.Write("'");                                        
                    Console.WriteLine(value);
                    //Console.Write("',");

                }                                      

        }          
    } 

"@

Add-Type -ReferencedAssemblies $Assem -TypeDefinition $Source -Language CSharp  


$LT = New-Object LP.Program

$LT.Get($srv)