“Manage files which have no checked in version” list larger than list view threshold

Hey guys,

We ran into an interesting problem the other day after our company acquired another company. Basically the business wanted to consolidate a large amount of the acquired company’s documents into a SharePoint Library with similar documents. This part is fine and can easily be done using explorer view of the library and dragging and dropping the necessary folder structures.

The problem was that the library in question had the setting “Require Check Out” set to yes. This means that all the files that were dropped into the library using explorer view would need to be checked in as there would be no current version.

To make matters worse, the user who dumped all the files left the company, hence there is no checked in version and all the files remain invisible to everyone in the site.

Generally for a scenario like this you could use the option “Manage files which have no checked in version” from the library settings under Permissions and Management

Then from there you could take ownership of all the files, and check them in yourself.

But for our scenario the number of files dropped exceeded our list view threshold by a lot and we couldn’t even open the view “Manage files which have no checked in version“. However even if we could view all the files i.e. extending the threshold temporarily,  it would have been a real pain taking ownership of them all and checking them all in.

PowerShell Solution.

I developed a short little set of PowerShell Functions that can take ownership of the files, then recursively check in all files that are being checked out by the system account.

#Add SharePoint Snapin if not using SharePoint's PowerShell Console
if ((Get-PSSnapin -Name Microsoft.SharePoint.PowerShell -ErrorAction SilentlyContinue) -eq $null )
Add-PsSnapin Microsoft.SharePoint.PowerShell
#First function takes ownerhip of all unmanaged files with no version
function Take-Ownership{
$site = Get-SPWeb -Identity $spSite
$list = $site.Lists[$spList]

$list.CheckedOutFiles | ForEach-Object{
$_.LeafName+ " had it's ownership taken from: "+$_.CheckedOutBy.DisplayName+"`n"
#This Function takes a folder object and recursively checks in
#all files which are checked out by the System Account
function checkin-AllFiles{
[Parameter(Mandatory=$true, ValueFromPipeline=$true)]

$currFolder.Files | ForEach-Object {
if ($_.CheckedOutByUser.UserLogin -eq "SHAREPOINT\system"){
$_.CheckIn("File checked in by administrator")
$_.Name+" has been checked in`n"
$currFolder.SubFolders| ForEach-Object{
checkin-AllFiles -currFolder $_
#This function basically combines the previous 2 for primary use
function Checkin-AllUnmanagedFiles{
$spSite = Get-SPWeb -identity $site
$spFolder = $spSite.Folders[$library]

"Taking ownership of the following Files`n"
Take-Ownership -spSite $site -spList $library

"Checking in the following files`n"
checkin-AllFiles -currFolder $spFolder

We can then run the script and use the Checkin-AllUnmanagedFiles function.

PS> Checkin-AllUnmanagedFiles -site "http://yoursite/" -library "Library Name"

For example I have a “Shared Documents” library which requires files be checked out for editing. I then dropped a few files into it’s explorer view

We can now see that these files show up in the library but are all checked out to myself hence no other user can see the file as there is no previous version yet.

Now if we run my script from the command shell:
(Note: I saved my script in a ps1 file called CheckinFiles.PS1)

PS> . .\CheckinFiles.PS1
PS> Checkin-AllUnmanagedFiles -site "http://torapd149:3434/subsite/" -library "Shared Documents" > .\checkin.txt

We can see all the files have now been checked in and modified by the System Account. Also I sent the output to a logfile called checkin.txt which tells which files were taking ownership of and which files were checked in.

Hopefully you will find this as useful as I have.