2009-08-12 35 views
10

Tôi đang cố gắng đệ quy đổi tên một loạt các thư mục TFS sử dụng tf rename, PowerShell và cụm từ thông dụng nhưng tôi đang gặp một số vấn đề với PowerShell vì tôi không dành nhiều thời gian cho nó. Đây là những gì tôi đã đặt lại với nhau cho đến nay để thay thế một 5 hàng đầu với 2.3.2 nhưng nó không làm việc:Làm cách nào để đổi tên tệp hàng loạt bằng PowerShell?

dir | foreach { tf rename $_ { $_.Name -replace '^5', '2.3.2' } } 

kết quả thực tế:

 
Unrecognized command option 'encodedCommand'. 
Unrecognized command option 'encodedCommand'. 
Unrecognized command option 'encodedCommand'. 
Unrecognized command option 'encodedCommand'. 
...etc. 

Cập nhật:

tôi nhận được một gần hơn bằng cách thực hiện các thao tác sau thay thế:

dir | foreach { $newname = $_.Name -replace "^5", "2.3.2"; tf rename $_ $newname } 

Mục tiêu tiếp theo của tôi là để làm cho thư mục con recurse này nhưng điều này có vẻ khó khăn hơn một chút (thay đổi nó thành dir -recurse làm cho nó thoát sau khi các thư mục cha vì một lý do nào đó).

+0

Không biết câu trả lời, nhưng là một câu hỏi hay. :) –

Trả lời

14

tôi sẽ lọc đầu tiên do 5 * vì vậy bạn chỉ quá trình tên bắt đầu bằng 5. Ngoài ra, trong trường hợp này vì tf.exe không phải là một lệnh PowerShell, bạn don' Tôi muốn sử dụng một scriptblock để xác định một tên mới. Chỉ cần sử dụng một biểu thức nhóm như sau:

dir -filter 5* | foreach { tf rename $_ ($_.Name -replace '^5', '2.3.2')} 

BTW, khi bạn đang cố gắng tham số debug đi đến một EXE tự nhiên như thế này nó là vô cùng hữu ích để sử dụng utilty echoargs.exe từ PowerShell Community Extensions. Đây là những gì nó nói với tôi về cách tiếp cận của bạn ban đầu:

6# dir -filter 5* | foreach { echoargs rename $_ { $_.Name -replace '^5', '2.3.2' } } 
Arg 0 is <rename> 
Arg 1 is <5foo.txt> 
Arg 2 is <-encodedCommand> 
Arg 3 is <IAAkAF8ALgBOAGEAbQBlACAALQByAGUAcABsAGEAYwBlACAAJwBeADUAJwAsACAAJwAyAC4AMwAuADIAJwAgAA==> 
Arg 4 is <-inputFormat> 
Arg 5 is <xml> 
Arg 6 is <-outputFormat> 
Arg 7 is <text> 
+0

Cảm ơn! Câu trả lời tuyệt vời. – Luke

1

Hãy thử điều này:

dir . | foreach { $newname = $_.Name -replace "^5", "2.3.2"; tf rename $_ $newname } 
4

Ghi chú:

  • TFS có native cmdlets - không cần tf.exe trong hầu hết các trường hợp.
  • Độ phức tạp về thời gian hoạt động của không gian làm việc phụ thuộc vào số lượng các tên đang chờ xử lý đã tồn tại trong không gian làm việc. Trong TFS 2005/2008 nó tồi tệ hơn nhiều so với tuyến tính. Tóm lại, bạn thực sự nên cân nhắc việc đổi tên thành nhiều checkins nếu bạn có một số lượng lớn các mục, nếu không thì mỗi "đổi tên tf" (hoặc New-TfsPendingChange -Rename nếu sử dụng các lệnh ghép ngắn) sẽ bắt đầu mất vài phút.
Các vấn đề liên quan