2016-06-15 2 views
1

У меня проблемы после того, как папка скопирована в другое место, мне нужно переименовать папки в каталоге, чтобы удалить «.deploy» с конца, но я получаю следующую ошибку ниже. У меня есть Googled для полномочий администратора PowerShell, но, похоже, не может найти «уловку» для моего сценария.Переименование папок после копирования

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

Вот что у меня есть:

$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 
    } 
} 

ответ

1

Вы должны использовать переключатель -Directory на Get-ChildItem командлете только получить каталоги. Затем используйте командлет Rename-Item, чтобы переименовать папки. Я использую функцию -replace с помощью простого regex, чтобы получить новое имя папки:

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

Вы даже не должны использовать Foreach-Object Командлет (Thanks to AnsgarWiechers):

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

Бесполезные использование 'ForEach-Object'. «Переименовать-элемент» можно прочитать из конвейера, так что вы можете напрямую передать ему результат «Get-ChildItem». –

+0

@AnsgarWiechers Но как вы получите доступ к старому имени, чтобы заменить '.deploy'? –

+3

'... | Переименовать-Item -NewName {$ _. Name -replace '\ .deploy $'} '(обратите внимание на фигурные скобки). –

Смежные вопросы