Using PowerShell to clean up SharePoint document library files with no versions

Versioning of SharePoint document libraries allows it to become a great repository for files.  You can check items in and out and maintain the history of the file automatically.  A powerful library tool in SharePoint document libraries is the ability to open the document library with Explorer.  If you have the Windows Desktop Experience installed (default on client OSs, manual on Server), you can open an Explorer Window that will allow you to drag and drop files directly into the document library.

Unfortunately, with this power, comes responsibility.  When versioning is enabled on the document library and performing drag & drop additions in this way, the items are not checked in.  Instead, you must check them in manually before they can be seen and used by anyone else who has permissions to that document library.  While usually this is performed manually, there are cases when you may wish to have some code do this for you.

Imagine a user dragging and dropping entire directory trees of documents into a library from their file system.  Then the user leaves the company and now the administrator is faced with hundreds of files listed in the "Manage files which have no checked in version".  What a mess!

So after some research, I wrote a little piece of PowerShell script that would recursively enumerate all the files in a document library and check them in if they were listed as checked out and had no version count. 

Prior to running this code as an administrator you must take ownership of all the files listed in the in the "Manage files which have no checked in version" section of the library settings page first.  If you do not do this, the files will not be checked in.  

When playing around with this script, it would be wise to comment out the $item.File.CheckIn("Checked in By Administrator")line of code to make sure you are actually getting the files you wish to check-in.  You can also manipulate the library by changing the values of $site, $root and $folder to values that need.  The real work is done once you call the function Set-CheckInFolderItems $folder This will recursively traverse the library specified by $folder and check in any files that have no versions.  After running this code, the list of files in the "Manage files which have no checked in version" page should be empty for that library.

The PowerShell script is below.  Note that the line of code Write-Host "Check in File: "$item.Name" Version count " $item.File.Versions.Count -foregroundcolor Green should be all on one line.  I had to reduuce the font so that it would display properly.  I've also attached a zip file with the code in it as well.  Enjoy!

 

[system.reflection.assembly]::LoadWithPartialName("Microsoft.Sharepoint")

$site = New-Object Microsoft.SharePoint.SPSite("https://SP2010")

$root = $site.allwebs[0]

$folder = $root.GetFolder("My Document Library")

#============================================================

# Function Set-CheckInFolderItems is a recursive function

# that will CheckIn all items in a list recursively

#============================================================

function Set-CheckInFolderItems([Microsoft.SharePoint.SPFolder]$folder)

{

    # Create query object

    $query = New-Object Microsoft.SharePoint.SPQuery

     $query.Folder = $folder

 

    # Get SPWeb object

    $web = $folder.ParentWeb

 

    # Get SPList

    $list = $web.Lists[$folder.ParentListId]

    # Get a collection of items in the specified $folder

    $itemCollection = $list.GetItems($query)

    # If the folder is the root of the list, display information

    if ($folder.ParentListID -ne $folder.ParentFolder.ParentListID)

    {

        Write-Host("Recursively checking in all files in " + $folder.Name)

    }

    # Iterate through each item in the $folder 

    foreach ($item in $itemCollection)

    {

        # If the item is a folder

        if ($item.Folder -ne $null)

        {

            # Write the Subfolder information

            Write-Host("Folder: " + $item.Name + " Parent Folder: " + $folder.Name)

            # Call the Get-Items function recursively for the found sub-solder

            Set-CheckInFolderItems $item.Folder

        }

        # If the item is not a folder

        if ($item.Folder -eq $null)

        {

            if ($item.File.CheckOutType -ne "None")

            {

                if ($item.File.Versions.Count -eq 0)

                {

                    # Check in the file

Write-Host "Check in File: "$item.Name" Version count " $item.File.Versions.Count -foregroundcolor Green

                    $item.File.CheckIn("Checked in By Administrator")

                }

            }

        }

    }

    $web.dispose()

    $web = $null

}

 

Set-CheckInFolderItems $folder

 

Recursive File Check In.zip