I blog about debugging, development using .net, C#, SQL, and other Microsoft technologies.
Disclaimer: All posts are provided "AS IS" with no warranties, confering no rights, and expressing only my personal opinion, not Microsoft's.
We can specify the versionspec to tf label either by supplying the /v or /version argument (for example, /v:C1256), or by appending it to the itemspec (for example, foo.cs;C1256). Here's an example that attaches the "goodbuild" label to version 1256 of $/proj/foo.cs:
tf label goodbuild /v:1256 $/proj/foo.cs
What about labeling all items in a certain changeset? We need to get a list of these items first:
tf changeset 1256
But this will invoke the changeset dialog, so we have to use the /noprompt or /i to get the output in the command prompt window:
tf changeset 1256 /i
The output includes extra info like changeset number, owner, date, comment, and check-in notes. To extract the lines of the Items section, which contains the itemspecs, pipe the output to the find command:
tf changeset 1256 /i | find "$/"
This should work just fine as long as "$/" doesn't show up else where, in a comment for instance. Apply more filters if necessary! The output should look like the following:
add $/proj/foo.cs edit $/proj/fold/bar.cs ...
We still got the Change column to get rid of, this can be accomplished using the parsing keywords of the for command that we will use for iteration:
for /f "usebackq tokens=2 delims=$" %i in (`tf changeset 1256 /i ^| find "$/"`) do tf label goodbuild /v:1256 $%i
We used the for command to iterate, the /f option specifies file parsing, and the "usebackq" parsing keyword indicates that the input file is the output of the command in the back quoted string, which in this case is:
`tf changeset 1256 /i ^| find "$/"`
We added the caret "^" to escape piping "|", otherwise, we will get the following error message:
| was unexpected at this time.
The parsing keywords do a great job to parse each line; "token=2 delims=$" passes the 2nd token from each line to the for body, with tokens delimited by $. That's why we had to prepend the $ to the itemspec in the for body as we lost it while parsing:
tf label goodbuild /v:1256 $%i
We may use any of the ways we saw before to specify the versionspec, such as:
tf label goodbuild $%i;C1256
So, the command would look like the following:
for /f "usebackq tokens=2 delims=$" %i in (`tf changeset 1256 /i ^| find "$/"`) do tf label goodbuild $%i;C1256