Search code examples
powershellcopyadministrator

Rename Folders After Copy


I'm having problems after a folder is copied to a different location, I need to rename the folders in the directory to remove ".deploy" from the end, but I get the following error below. I have Googled around for PowerShell admin permissions, but cannot seem to find a 'catch-all' for my scenario.

Get-Content : Access to the path 'C:\OldUserBackup\a.deploy' is denied.
At C:\PSScripts\DesktopSwap\TestMergeDir.ps1:28 char:14
+             (Get-Content $file.PSPath) |
+              ~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : PermissionDenied: (C:\OldUserBackup\a.deploy:String) [Get-Content], UnauthorizedAccessException
    + FullyQualifiedErrorId : GetContentReaderUnauthorizedAccessError,Microsoft.PowerShell.Commands.GetContentCommand

Here is what I have:

$UserName = [Environment]::UserName
$CurrUser = [Environment]::UserName + '.deploy'
$OldUserDir = 'C:\OldUserBackup'
$CurrDate = Get-Date -format G

$PathExist = Test-Path $OldUserDir

if ($PathExist -eq $true) {
    #Copy Desktop, Downloads, Favorites, Documents, Music, Pictures, Videos
    Copy-Item -Path $OldUserDir -Destination C:\Users\$UserName\Desktop\CopyTest -Recurse -Force

    $configFiles = Get-ChildItem $OldUserDir *.deploy -rec
    foreach ($file in $configFiles) {
        (Get-Content $file.PSPath) |
            Foreach-Object { $_ -replace ".deploy", "" } |
            Set-Content $file.PSPath
    }
} 

Solution

  • You should use the -Directory switch on the Get-ChildItem cmdlet to only get directories. Then use the Rename-Item cmdlet to rename the folders. I use the -replace function with a simple regex to get the new folder name:

    $deployFolders = Get-ChildItem $OldUserDir *.deploy -rec -Directory
    $deployFolders | Foreach { 
        $_ | Rename-Item -NewName ($_.Name -replace ('\.deploy$') )
    }
    

    You don't even have to use the Foreach-Object cmdlet (Thanks to AnsgarWiechers):

    Get-ChildItem $OldUserDir *.deploy -rec -Directory | 
        Rename-Item -NewName { $_.Name -replace ('\.deploy$') }