Powershell&TFS_Part 1
目录
前言
憋了这么久,Powershell主题终于开搞了。因为工作需要,Powershell可以说是半路出家边学边卖,所以这个主题可能没有Python和Linux那样分类、归纳得太好。而且我们跳过语法,直接应用开搞。语法什么的,就在一个个脚本中稍带介绍吧。
TFS
Team Fundation Server:是一种为Microsoft产品提供源代码管理、数据收集、报告和项目跟踪,和为协作软件开发的项目。 可作为独立的软件,或Visual Studio Team System(VSTS)服务器端。
TFS包含:
1. 团队项目集合:Team Foundation Server中所有数据的主要组织单位。集合可以包含一个或多个团队项目。
2. 团队项目:团队用于共享开发特定软件技术或产品所需的团队活动的中心点。
3. 应用层、数据层、客户端层:组成Team Foundation Server的逻辑层。这些层可能全部部署在同一台物理计算机上,也可能安装在多台计算机上。
对象模型
通过Team Foundation Server的对象模型,Team Foundation的逻辑层可以进行通信交互,软件集成商及其他公司可以自定义和扩展Team Foundation Server功能。
Team Foundation Server对象模型是一组包含下列接口的托管 API:
▲Team Foundation Framework 服务
◆管理服务
◆事件服务
◆团队项目集合服务
◆注册服务
◆安全性服务
◆位置服务
◆标识管理服务
◆目录服务
◆作业服务
◆属性服务
▲版本控制对象模型
▲工作项跟踪对象模型
▲Team Foundation Build 对象模型
API的动态链接库存放路径:
D:\Visual Studio 2012\Microsoft Visual Studio 11.0\Common7\IDE\ReferenceAssemblies\v2.0
Powershell
Windows PowerShell是一种命令行外壳程序和脚本环境,使命令行用户和脚本编写者可以利用.NET Framework的强大功能。PowerShell v3采用新的cmdlet让管理员能够更深入到系统进程中,这些进程可以制作成可执行的文件或脚本(script)。一条cmdlet是一条轻量命令,Windows PowerShell运行时间在自动化脚本的环境里调用它。Cmdlet包括显示当前目录的Get-Location,访问文件内容的Get-Content和结束运行进程的Stop-Process。
一些Cmdlet的例子:
查看可以指令:get-command *-service
查看指令帮助手册:get-help [commands]
查看对象的成员信息:get-service | get-member
Powershell面向对象
Powershell命令的输出即为对象。可以将输出对象发送给另一条命令以作为其输入。因此,Windows PowerShell为曾使用过其他外壳程序的人员提供了熟悉的界面,同时引入了新的、功能强大的命令行范例。通过允许发送对象(而不是文本),它扩展了在命令之间发送数据的概念。
Powershell默认会在PC中设置执行脚本权限
为防止恶意脚本的执行,PowerShell有一个执行策略,默认情况下,这个执行策略被设为受限的(Restricted),意味着PowerShell脚本无法执行,你可以使用下面的cmdlet命令获取当前的执行策略:
Get-ExecutionPolicy
你可以选择使用的执行策略有:
Restricted (脚本不能运行)
RemoteSigned (本地创建的脚本可以运行,但从网上下载的脚本不能运行,除非它们拥有由受信任的发布者签署的数字签名)
AllSigned (仅当脚本由受信任的发布者签名才能运行)
Unrestricted (脚本执行不受限制,不管来自哪里,也不管它们是否有签名都能执行)。
你可以使用下面的cmdlet命令设置PowerShell的执行策略:
Set-ExecutionPolicy <PolicyName>
调试脚本
断点
运行一个可能有BUG的PowerShell脚本时,保护自己的方法就是在脚本的关键位置插入断点,插入断点最简单的方法是根据行号插入。
插入断点:
New-PSBreakpoint -Script C:\Scripts\a.ps1 -Line 10
你也可以将断点绑定到变量上,如果你希望你的脚本任何时候都可以修改a$的内容,可以使用下面的命令:
New-PSBreakpoint -Script C:\scripts\a.ps1 -variables a #注意,我在变量名后并没有包括美元符号。
可以和PSBreakpoint一起使用的动词包括New,Get,Enable,Disable和Remove。
Step
调试一个脚本时,有时可能需要逐行运行脚本,这时你可以使用Step-Into cmdlet命令,它会使脚本一行一行地执行,不管有没有设置断点,如果你想从这种步进式运行模式退出来,使用Step-Out cmdlet命令即可,但需要注意的是,使用Step-Out cmdlet命令后,断点仍然有效。
顺便说一句,如果你的脚本使用了函数,你可能对Step-Out cmdlet更感兴趣,Step-Out的工作方式和Step-Into一样,不过,如果Step-Out调用了一个函数,Windows不会逐步执行,整个函数将会一次性执行。
Microsoft Visual Studio Team Foundation Server 2012 Power Tools
Power Tools可以使用Powershell来管理TFS,是连接TFS的必备工具。
下载地址:https://visualstudiogallery.msdn.microsoft.com/b1ef7eb2-e084-4cb8-9bc7-06c3bad9148f
Windows PowerShell Cmdlets:
This tool provides a Windows PowerShell interface that supports basic version control commands and a pipeline and glue to enable scripting.
Work Item Templates:
A plug-in to Visual Studio, this tool provides an add-in to the Team menu and a new section on the Work Items page in Team Explorer. Use this tool to create new work items with default values, or to easily apply values to existing work items.
Power Tools支持的指令集:
Command | Description |
---|---|
addprojectportal | Add or move portal for an existing team project |
addprojectreports | Add or overwrite reports for an existing team project |
annotate | Display line-by-line change information for a file |
bind | Convert VSS-bound solutions into TFS-bound solutions |
branches | Convert, reparent, list, and update branches |
builddefinition | Clone, Diff or Dump build definitions |
buildprocesstemplate | Manage build process templates |
connections | Modifies Team Explorer client connection settings |
createteamproject | Create a team project |
getcs | Get only the changes in a particular changeset |
online | Pend adds, edits, deletes to writable files |
query | Query for work items |
review | Review (diff/view) workspace changes |
scorch | Ensure source control and the local disk are identical |
searchcs | Search for changesets matching specific criteria |
treeclean | Delete files and folders not under version control |
unshelve | Unshelve into workspace with pending changes |
uu | Undo changes to unchanged files in the workspace |
workitem | Create, update, or view work items |
安装Power Tools后添加Snapin:
Snapin是一组.NET程序集,或者程序集集合,其中包含了Cmdlets、提供程序、类型扩展和格式元数据。
Add-PSSnapin Microsoft.TeamFoundation.PowerShell
查看Snapin指令集:
Get-Command -Module Microsoft.TeamFoundation.PowerShell
程序集
程序集是 .NET Framework编程的基本组成部分,类似于API、动态链接库。
1. 程序集(assembly)是一个或多个托管模块,以及一些资源文件的逻辑组合。
2. 程序集是组件复用,以及实施安全策略和版本策略的最小单位。
3. 程序集是包含一个或者多个类型定义文件和资源文件的集合。在程序集包含的所有文件中,有一个文件用于保存清单。(清单是元数据部分中一组数据表的集合,其中包含了程序集中一部分文件的名称,描述了程序集的版本,语言文化,发布者,共有导出类型,以及组成该程序集的所有文件)。
4. 作为一个单元进行版本控制和部署的一个或多个文件的集合。程序集是 .NET Framework应用程序的主要构造块。所有托管类型和资源都包含在某个程序集内,并被标记为只能在该程序集的内部访问,或者被标记为可以从其他程序集中的代码访问。程序集在安全方面也起着重要作用。代码访问安全系统使用程序集信息来确定为程序集中的代码授予的权限集。
连接到TFS
在安装了Power Tools之后,只需要执行两条指令:TFS2012修复了64位机加注册表的BUG。
PS C:\Users\JMilk.fan> $serverUrl = '[TFSURL]'
PS C:\Users\JMilk.fan> Get-TfsServer -Name $serverUrl
Team Project Collections:团队项目集合(connect to ream foundation server),一个Team Project Collection可以包含很多个Team Project,类似于VS解决方案与项目之间的一对多关系。
获取TPCList
Team Project Collections:团队项目集合(connect to ream foundation server),一个Team Project Collection可以包含很多个Team Project,类似于VS解决方案与项目之间的一对多关系。
[Reflection.Assembly]::Load("Microsoft.TeamFoundation.Client, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a");
$instanceBaseUrl = "TFSURL";
$tfsServer = New-Object Microsoft.TeamFoundation.Client.TfsConfigurationServer $instanceBaseUrl;
# 调用 ITeamProjectCollectionService
$tpcSvc = $tfsServer.GetService([Microsoft.TeamFoundation.Framework.Client.ITeamProjectCollectionService]);
foreach($co in $tpcSvc.GetCollections())
{
Write-Host $co.Name #打印TPC内的项目名称
}
获取TPC中的team project
[Reflection.Assembly]::Load("Microsoft.TeamFoundation.Client, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a");
$url = New-Object -TypeName Uri -ArgumentList "TFSURL"
$project = New-Object -TypeName Microsoft.TeamFoundation.Client.TfsTeamProjectCollection -ArgumentList $url
Get-TfsChildItem -Server $project | Select ServerItem, CheckinDate
获取workspace
加载对象模型程序集:类似一般项目添加引用,不加载无法使用程序集的属性和方法。
LoadWithPartialName(”)函数,需要传入程序集的dll文件名字或文件全路径。如果传入的是dll文件名字,则会先在当前启动路径当中查找。
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.TeamFoundation.Client")
创建对象:
$url = New-Object -TypeName Uri -ArgumentList "TFSURL"
$project = New-Object -TypeName Microsoft.TeamFoundation.Client.TfsTeamProjectCollection -ArgumentList $url
Get-TfsWorkspace -Server $project
获取workItemStore
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.TeamFoundation.Client")
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.TeamFoundation.WorkItemTracking.Client")
$teamProjectCollection = [Microsoft.TeamFoundation.Client.TfsTeamProjectCollectionFactory]::GetTeamProjectCollection("TFSURL")
$ws = $teamProjectCollection.GetService([type]"Microsoft.TeamFoundation.WorkItemTracking.Client.WorkItemStore")
访问workitem
使用TFS API编程访问TFS服务器中workitem,首先要明确TFS服务器的URL,TFS服务器访问就像访问网站。需要通过一个网络地址。
workitem相关程序集的组织结构:
Microsoft.TeamFoundation.Client.TfsTeamProjectCollection;
Microsoft.TeamFoundation.WorkItemTracking.Client.WorkItemStore;
Microsoft.TeamFoundation.WorkItemTracking.Client.Project;
Microsoft.TeamFoundation.WorkItemTracking.Client.WorkItemType;
Microsoft.TeamFoundation.WorkItemTracking.Client.WorkItem;
TfsTeamProjectCollection像是一座物理建筑,它有门牌编号,我们通过门牌号码找到该建筑。
WorkItemStore像是图书馆,里边存放各种类别,各种年级的书籍。
Project像是年级的概念,每个年级是隔离的,每个年级也都有不同类别的书,比如各年级都有语文,数学,英语等类别的书籍。
WorkItemType是类别的概念,比如数学,英语。每个Project有不同WorkItemType的工作项。如一年纪有语文学习的书籍,数学学习的书籍;二年级也有语文类的书籍,数学类的书籍。
获取workItem中的项目
查询TFS中的工作项是通过SQL语句Query出来的,返回结果是Microsoft.TeamFoundation.WorkItemTracking.Client.WorkItemCollection.
$incidents = $ws.Query(@"
SELECT [System.Id]
FROM WorkItems
WHERE
[System.WorkItemType] = 'RDIncident' AND [System.State] = 'Triage' AND [System.Title] Contains 'Rma:'
"@)
获取指定TPC的更改集
[Reflection.Assembly]::Load("Microsoft.TeamFoundation.Client, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a");
$url = New-Object -TypeName Uri -ArgumentList "TFSURL"
$co = New-Object -TypeName Microsoft.TeamFoundation.Client.TfsTeamProjectCollection -ArgumentList $url
Get-TfsChangeset -Server $co –Latest
URI\URL\URN的区别
URI:是uniform resource identifier,统一资源标识符,用来唯一的标识一个资源。
URL:是uniform resource locator,统一资源定位器,它是一种具体的URI,即URL可以用来标识一个资源,而且还指明了如何locate这个资源。
URN:uniform resource name,统一资源命名,是通过名字来标识资源,比如jmilk@fan.com。
也就是说,URI是以一种抽象的,高层次概念定义统一资源标识,而URL和URN则是具体的资源标识的方式。URL和URN都是一种URI。
最后
因为工作的保密性,所以不能拿手上项目的代码来充当例子,就在网上找到了一些相似的代码来作说明。:-(
Jmilk
Powershell&TFS_Part 1的更多相关文章
- 在PowerShell中使用curl(Invoke-WebRequest)
前言 习惯了windows的界面模式就很难转去命令行,甚至以命令行发家的git也涌现出各种界面tool.然而命令行真的会比界面快的多,如果你是一个码农. situation:接到需求分析bug,需要访 ...
- Windows 7上执行Cake 报错原因是Powershell 版本问题
在Windows 7 SP1 电脑上执行Cake的的例子 http://cakebuild.net/docs/tutorials/getting-started ,运行./Build.ps1 报下面的 ...
- <译>通过PowerShell工具跨多台服务器执行SQL脚本
有时候,当我们并没有合适的第三方工具(大部分需要付费)去管理多台数据库服务器,那么如何做最省力.省心呢?!Powershell一个强大的工具,可以很方便帮到我们处理日常的数据库维护工作 .简单的几步搞 ...
- 利用PowerShell复制SQLServer账户的所有权限
问题 对于DBA或者其他运维人员来说授权一个账户的相同权限给另一个账户是一个很普通的任务.但是随着服务器.数据库.应用.使用人员地增加就变得很枯燥乏味又耗时费力的工作.那么有什么容易的办法来实现这个任 ...
- PowerShell 数组以及XML操作
PowerShell基础 PowerShell数组操作 将字符串拆分成数据的操作 cls #原始字符串 $str = "abc,def,ghi,mon" #数据定义 #$StrAr ...
- linux下mono,powershell安装教程
1简介 简单来说pash就是bash+powershell 2官网 https://github.com/Pash-Project/Pash 3下载fedora20---lxde桌面---32位版. ...
- Windows下PowerShell监控Keepalived
一.背景 某数据库服务器为CentOS,想要监控Keepalived的VIP是否有问题,通过邮件进行报警,但这台机器不能上外网,现在只能在Windows下通过PowerShell来完成发邮件预警. 二 ...
- 使用PowerShell收集多台服务器的性能计数器
写在前面 当管理多台Windows Server服务器时(无论是DB.AD.WEB以及其他的应用服务器),当出现性能或其他问题后,参阅性能计数器都是一个非常好的维度从而推测出问题可能出现的原因 ...
- 野路子出身PowerShell 文件操作实用功能
本文出处:http://www.cnblogs.com/wy123/p/6129498.html 因工作需要,处理一批文件,本想写C#来处理的,后来想想这个是PowerShell的天职,索性就网上各种 ...
随机推荐
- linux:输入/输出、重定向、管道
输入.输出: 程序的默认输入设备,叫标准输入. stdin 键盘 0 程序的默认输出设备,叫标准输出. stdout 监视器 1 程序的默认错误输出设备,叫标准错误输出.stde ...
- SPSS Statistics 26.0 下载安装和激活
目录 1. 其他版本 2. IBM SPSS Statistics 26 新增功能 3. 安装步骤 4. 下载地址 1. 其他版本 参考:https://www.cnblogs.com/coco56/ ...
- dockerfile制作笔记
dockerfile语法格式: FROM: 基础镜像(就是在什么镜像上面做) MAINTAINER: 镜像创建者信息(作者的信息) EXPOSE: 开放的端口 ENV: 设置变量 ...
- AlertDialog用法。
AlertDialog 可以在当前的界面弹出一个对话框,这个对话框是置顶于所有界面元素之上的,能够屏蔽掉其他控件的交互能力,因此一般 AlertDialog 都是用于提示一些非常重要的内容或者警告信息 ...
- Flask 框架app = Flask(__name__) 解析
#!/usr/local/bin/python # coding=utf-8 from flask import Flask app = Flask(__name__) @app.route('/') ...
- 1129. Recommendation System (25)
Recommendation system predicts the preference that a user would give to an item. Now you are asked t ...
- spring security There was an unexpected error (type=Forbidden, status=403).
https://blog.csdn.net/qq_27093097/article/details/83190240 spring security There was an unexpected e ...
- Python核心技术与实战——八|匿名函数
今天我们来学习一下匿名函数.在学习了上一节的自定义函数后,是时候了解一下匿名函数了.他们往往非常简短,就一行,而且有个关键字:lambda.这就是弥明函数. 一.匿名函数基础 匿名函数的基本格式是这样 ...
- STL容器Map
Map的常见函数 Map的实现机制 STL中的Map底层实现机制是RB树(红-黑树)
- Java并发-CycliBarrier
栅栏类似于闭锁,它能阻塞一组线程直到某个事件的发生.栅栏与闭锁的关键区别在于,所有的线程必须同时到达栅栏位置,才能继续执行.闭锁用于等待事件,而栅栏用于等待其他线程.package com.examp ...