मुझे चयनित फ़ोल्डरों को TFS स्रोत नियंत्रण से स्थानीय फ़ाइल फ़ोल्डर में डाउनलोड करने की आवश्यकता है। मैं निम्नलिखित स्क्रिप्ट का उपयोग करके ऐसा करने में सक्षम हूं:

Add-PSSnapin Microsoft.TeamFoundation.PowerShell
$securePass = ConvertTo-SecureString -AsPlainText -Force -String "mypassword"
$uri = "serverURL"
$cred =  New-Object System.Management.Automation.PSCredential("myusername",$securePass)

$tfsServer = Get-TfsServer -Name $uri -Credential $cred
$structureService = $tfsServer.GetService("Microsoft.TeamFoundation.Server.ICommonStructureService")

$versionControlService = $tfsServer.GetService("Microsoft.TeamFoundation.VersionControl.Client.VersionControlServer")

$pathsToDownload=[System.Collections.ArrayList]@()
$pathsToDownload.add("$/myfirstPath")
$pathsToDownload.add("$/mysecondPath")
$pathsToDownload.add("$/mythirdPath")

$localTFSRoot = "c:\tfs"
$serverRoot = "$/"
foreach ($serverPath in $pathsToDownload) {
  write-host "Working with $serverPath"
  $items = Get-TfsChildItem -Server $tfsServer -Item $serverPath -Recurse
  foreach ($item in $items) {
    $destinationPath=$($Item.ServerItem.Replace($serverRoot,$localTFSRoot)).replace("\","/")
    write-host "Downloading $destinationPath"
    if ($item.ItemType -eq "Folder") {
       #create directory if it doesn't already exist
       if (-Not (Test-Path $destinationPath -PathType Container -IsValid)) {
          New-Item -ItemType Directory -Path $destinationPath -Force
       }
    } else {
       $versionControlService.DownloadFile($item.ServerItem,$destinationPath)
    }
  }
}

हालांकि, यह स्क्रिप्ट हर बार सभी फाइलों को डाउनलोड करती है। मैं फाइलों को तभी डाउनलोड करना चाहूंगा जब फाइल में कोई बदलाव हो। क्या पॉवरशेल ऑपरेशंस के माध्यम से इस तरह के ऑपरेशन को करने का कोई तरीका है? मुझे यकीन नहीं है कि getItem क्या करता है बनाम downloadfile।

आपके सहयोग के लिए धन्यवाद।

अद्यतन करें *** मैं कार्यक्षेत्र मार्ग का उपयोग करके डाउनलोड करने में सक्षम था लेकिन मैंने कोशिश नहीं की है कि यह केवल अद्यतन के लिए काम करता है। हालांकि, workspace.get() बिना किसी वर्बोज़ आउटपुट के डाउनलोड हो रहा है। क्या इसे उन फ़ाइलों को सूचीबद्ध करने का कोई तरीका है जिनके साथ यह काम कर रहा है ताकि उपयोगकर्ता को यह न लगे कि इसे डाउनलोड करते समय लटका दिया गया है?

if ( (Get-PSSnapin -Name Microsoft.TeamFoundation.PowerShell -ErrorAction SilentlyContinue) -eq $null ) {
 Add-PSSnapin Microsoft.TeamFoundation.PowerShell
}
$securePass = ConvertTo-SecureString -AsPlainText -Force -String "mypassword"
$uri = "https://myserver"
$cred =  New-Object System.Management.Automation.PSCredential("myusername",$securePass)

$tfsServer = Get-TfsServer -Name $uri -Credential $cred
$structureService = $tfsServer.GetService("Microsoft.TeamFoundation.Server.ICommonStructureService")
$versionControlService = $tfsServer.GetService("Microsoft.TeamFoundation.VersionControl.Client.VersionControlServer")

$workSpaceName = $env:USERNAME + "-IMAG"

$localTFSWorkspace="c:\tfswspace"
$serverRoot = "$/myproject"
$pathsToDownload=[System.Collections.ArrayList]@()
$pathsToDownload.add("$/myproject/path1")
$pathsToDownload.add("$/myproject/path2")

$testPath = $($pathsToDownload[0].Replace($serverRoot,$localTFSWorkspace)).replace("/","\")

if (!(Test-Path $localTFSWorkspace -PathType Container)) {
  New-Item $localTFSWorkspace -ItemType Directory -Force
}

# Check if workspace already exists
     $workspace = $versionControlService.TryGetWorkspace($testPath)
     if ($workspace -eq $null) {
       #Workspace doesn't exist, we need to create one
       $workspace = $versionControlService.CreateWorkspace($workSpaceName,$cred.UserName, 'Workspace for Repository Sync')
     }

 #create mappings if these don't exist 
 foreach ($serverPath in $pathsToDownload) {
      $localPath = $($serverPath.Replace($serverRoot,$localTFSWorkspace)).replace("/","\")
      if (!(Test-Path $localPath -PathType Container)) {
         New-Item $localPath -ItemType Directory -Force
      }

    $workingFolder =  $workspace.TryGetWorkingFolderForServerItem($serverPath)

    if ($workingFolder -eq $null) {
      #create mapping here
      $workspace.Map($serverPath,$localPath)
    }
 }
 # Now mappings are done -- get items now
 $workspace.get()
0
sohail 19 जून 2018, 20:58

2 जवाब

सबसे बढ़िया उत्तर

मैं नीचे दिए गए कोड नमूने का उपयोग करके कार्यक्षेत्र विकल्प का उपयोग करके कोड प्राप्त करने में सक्षम था।

if ( (Get-PSSnapin -Name Microsoft.TeamFoundation.PowerShell -ErrorAction SilentlyContinue) -eq $null ) {
     Add-PSSnapin Microsoft.TeamFoundation.PowerShell
    }
    $securePass = ConvertTo-SecureString -AsPlainText -Force -String "mypassword"
    $uri = "https://myserver"
    $cred =  New-Object System.Management.Automation.PSCredential("myusername",$securePass)

$tfsServer = Get-TfsServer -Name $uri -Credential $cred
$structureService = $tfsServer.GetService("Microsoft.TeamFoundation.Server.ICommonStructureService")
$versionControlService = $tfsServer.GetService("Microsoft.TeamFoundation.VersionControl.Client.VersionControlServer")

$workSpaceName = $env:USERNAME + "-IMAG"

$localTFSWorkspace="c:\tfswspace"
$serverRoot = "$/myproject"
$pathsToDownload=[System.Collections.ArrayList]@()
$pathsToDownload.add("$/myproject/path1")
$pathsToDownload.add("$/myproject/path2")

$testPath = $($pathsToDownload[0].Replace($serverRoot,$localTFSWorkspace)).replace("/","\")

if (!(Test-Path $localTFSWorkspace -PathType Container)) {
  New-Item $localTFSWorkspace -ItemType Directory -Force
}

# Check if workspace already exists
     $workspace = $versionControlService.TryGetWorkspace($testPath)
     if ($workspace -eq $null) {
       #Workspace doesn't exist, we need to create one
       $workspace = $versionControlService.CreateWorkspace($workSpaceName,$cred.UserName, 'Workspace for Repository Sync')
     }

 #create mappings if these don't exist 
 foreach ($serverPath in $pathsToDownload) {
      $localPath = $($serverPath.Replace($serverRoot,$localTFSWorkspace)).replace("/","\")
      if (!(Test-Path $localPath -PathType Container)) {
         New-Item $localPath -ItemType Directory -Force
      }

    $workingFolder =  $workspace.TryGetWorkingFolderForServerItem($serverPath)

    if ($workingFolder -eq $null) {
      #create mapping here
      $workspace.Map($serverPath,$localPath)
    }
 }
 # Now mappings are done -- get items now
 $workspace.get()
0
sohail 30 जून 2018, 00:05

सभी फ़ाइलें प्राप्त करने के लिए आपको एक कार्यक्षेत्र बनाना होगा। जब आप Get करते हैं, तो आप देखेंगे कि सभी फ़ाइलें कार्यस्थान में डाउनलोड की गई हैं। यदि कार्यस्थान की फ़ाइलें नवीनतम हैं, तो कोई भी फ़ाइल डाउनलोड नहीं की जाएगी। एक बार TFS में नई अद्यतन फ़ाइलें आ जाने पर, Get निष्पादित करने के बाद, केवल अद्यतन की गई फ़ाइलें बदली जाएंगी। वर्कस्पेस बनाने के तरीके के बारे में सी # कोड स्निपेट यहां दिया गया है:

            TfsTeamProjectCollection tfs = new TfsTeamProjectCollection(new Uri("http://tfs:8080/tfs/defaultCollection"));
            var versioncontrols = tfs.GetService<VersionControlServer>();

            var workspace = versioncontrols.CreateWorkspace("workspacename", "workspaceowner");

            String ServerFolder = @"$/xxxx/xxxx";
            String LocalFolder = @"E:\test";

            WorkingFolder workfolder = new WorkingFolder(ServerFolder, LocalFolder);
            workspace.CreateMapping(workfolder);

            workspace.Get();
0
Cece Dong - MSFT 21 जून 2018, 12:54