Prologue
Ace Fekay here again.
You might say to yourself this is some really simple stuff. Sure, it might be, for the pro. As many of you know, I’m an avid Active Directory and Exchange server engineer/architect, and an MVP in Active Directory.
Therefore with AD, Exchange, and Office 365, you will find that scripting comes into play more and more with your daily tasks. The main reason I’m posting simple scripts is that to get the job done, I just needed an arsenal of simple quickie scripts when called upon a simple task, such as this one, when tasked to quickly get a list of users in a group.
I hope this, and my future scripts, especially with Office 365, help you out.
Scope
This is one method to migrate data from one file server to another. I have one method that I will post later, that does it by the share names. This is to just get the two closer to having the same data before I run the final script.
DFS
Keep in mind, we use DFS. I will already have created a new target to the new file server for the current share, but keep the new targets disabled until ready to cut over.
However, when we cut over the target to the new server, we would like to shut off the shares on the source (old) server, to prevent anyone from using it. Of course, we’ve already communicated to the user base the migration schedule.
Therefore, since the shares will be deleted, we must rely on running this by using IP addresses and relative paths from the default administrative shares (c$, d$, etc).
Share and NTFS Permissions Backup
Yes, absolutely! You definitely want to back up your Share and NTFS permissions on this server just in case something happens! The following link is a great article to show you how to do it:
How to Back Up and Restore NTFS and Share Permissions
http://blogs.technet.com/b/askds/archive/2008/11/24/how-to-back-up-and-restore-ntfs-and-share-permissions.aspx
Easy? Nah…
Many may say this is simple stuff. Sure, for the seasoned scripter, which I’m not, The main reason I’m posting this, and I will be posting much more, including Office 365 scripts, is that I had to look it up. I’ve found various websites that provide how-tos, but when it comes to handling variables and piping, I’ve found there is no one place to get various examples and have found myself looking at multiple places to get this info, including my colleagues, who are extremely adept at scripting. With many place, I also see elaborate scripts that do more than what I need. They are fabulous blogs and websites, but sometimes I need the simple one-liners to perform day to day stuff.
Script:
/
# Uses relative paths
# Make sure you change directory to where your script is located on the computer you are running this before running
#
# =========================================================================================
#Function: Get the Total Size of Folder
function Get-Size
{
param([string]$pth)
“{0:n2}” -f ((gci -path $pth -recurse | measure-object -property length -sum).sum /1mb) + ” mb”
}
# =========================================================================================
#
cd “C:\PSScripts\OldServerName”
$SourceServerNetBIOSName = “OldServerName”
$SourceServerIP = “10.100.200.200”
$DestinationServerName = “NewFileServer.contoso.com”
#**************************************************************************************
#Ignore this section
#Test files with only one share
#Note: This section was a test to see if I can get this script to work if there is only one share.
#I could not get it to work with one share. The reason is there must be two (2) or more shares for
#this to work, because I’m using an array. There is no such thing as a single array.
#$SourceServerPath = @()
#$SourceServerShares = @()
#$DestinationServerShareNames = @()
#$SourceServerPath = Get-Content ‘.\OldServerName-Share-paths-test.txt’
#$SourceServerShares = Get-Content ‘.\OldServerName-SourceSharesList-test.txt’
#$DestinationServerShareNames = Get-Content ‘.\OldServerName-DestinationSharesList-test.txt’
#Ignore this section
#**************************************************************************************
$SourceServerPath = Get-Content ‘.\OldServerName-Share-paths.txt’
$SourceServerShares = Get-Content ‘.\OldServerName-SourceSharesList.txt’
$DestinationServerShareNames = Get-Content ‘.\OldServerName-DestinationSharesList.txt’
$LogDestinationFolder = “.\Logs”
$LogfileName = $SourceServerNetBIOSName+”.txt”
$LogFileAndPath = $LogDestinationFolder+”\”+$LogfileName
# Checks for existence of a directory for log files if not, one gets created.
If (!(Test-Path -Path $LogDestinationFolder)){
New-Item -ItemType directory -Path $LogDestinationFolder
}
write-host “Total Share count = ” $SourceServerShares.count
for ($i = 0; $i -lt $SourceServerShares.count; $i++){
$srcpath = $SourceServerPath[$i] -replace ‘(.*):’,’$1$’
#$srcpath = $SourceServerPath -replace ‘(.*):’,’$1$’
$dstpath = $DestinationServerShareNames[$i]
$FullSourcePath = “\\”+$SourceServerIP+”\”+$srcpath
$FullDestPath = “\\”+$DestinationServerName+”\”+$dstpath
write-host “”
if ((Test-Path $FullSourcePath) -and (Test-Path $FullDestPath))
{
$log = $LogDestinationFolder + “\” + $SourceServerNetBIOSName + “-” + $SourceServerShares[$i] +”.txt”
write-host “Current share’s log:” $Log
robocopy $FullSourcePath $FullDestPath /E /R:1 /W:1 /TEE /log:$log | Out-String
#This is trying different switches – Ignore
#robocopy $FullSourcePath $FullDestPath /MIR /copy:DT /W:5 /R:1 /V /IT /FP /NFL /TS /log:$log | Out-String
#This was a local drive to drive attempt – Ignore
#robocopy e:\users y: /copy:DATSO /E /R:1 /W5 /TEE /log:c:\robocopy.log
write-host “Source path is: ” $srcpath
write-host “Full Source Path is: ” $FullSourcePath
write-host “Destination path is:” $dstpath
write-host “Full Destination path is: ” $FullDestPath
$SharesProcessedSoFar = $i + 1
write-host “Shares processed so far =” $SharesProcessedSoFar ” out of a total share count of ” $SourceServerShares.count
write-host “”
Write-Host “”
}
else
{
write-host “Problem with: ” $srcpath “Destination sharename is:” $dstpath
write-host “Referencing full Source Path:” $FullSourcePath “Destination Path:” $FullDestPath
$SharesProcessedSoFar = $i + 1
write-host “Shares processed so far =” $SharesProcessedSoFar ” out of a total share count of ” $SourceServerShares.count
}
}
write-host “Total Shares processed = ” $SourceServerShares.count
More to come…
Comments are welcomed.
==================================================================
Summary
I hope this helps!
Published 10/3/2015
Ace Fekay
MVP, MCT, MCSE 2012, MCITP EA & MCTS Windows 2008/R2, Exchange 2013, 2010 EA & 2007, MCSE & MCSA 2003/2000, MCSA Messaging 2003
Microsoft Certified Trainer
Microsoft MVP – Directory Services
Complete List of Technical Blogs: http://www.delawarecountycomputerconsulting.com/technicalblogs.php
This posting is provided AS-IS with no warranties or guarantees and confers no rights.