파일 이름에서 (2020_11_23 09_41_34 UTC)를 삭제하는 방법

파일 이름에서 (2020_11_23 09_41_34 UTC)를 삭제하는 방법

다음 명령을 사용하여 관리자 권한으로 Powershell을 사용해 보았습니다.

Get-ChildItem -Recurse | Where-Object { $_.Name -match " ?\(\d\d\d\d_\d\d_\d\d \d\d_\d\d_\d\d UTC\)" } | Rename-Item -NewName { $_.Name -replace " ?\(\d\d\d\d_\d\d_\d\d \d\d_\d\d_\d\d UTC\)", ""}

많은 오류가 발생합니다.

Get-ChildItem : L'accès au chemin d'accès 'C:\Windows\system32\LogFiles\WMI\RtBackup' est refusé.
Au caractère Ligne:1 : 1
+ Get-ChildItem -Recurse | Where-Object { $_.Name -match " ?\(\d\d\d\d_ ...
+ ~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : PermissionDenied: (C:\Windows\syst...es\WMI\RtBackup:String) [Get-ChildItem], UnauthorizedAccessException
    + FullyQualifiedErrorId : DirUnauthorizedAccessError,Microsoft.PowerShell.Commands.GetChildItemCommand

어떻게 해야 합니까?

답변1

해당 위치가 관리자 전용 액세스로 보호되지 않은 경우 또는 파일을 생성했거나 수행 중인 작업을 수행할 수 있는 올바른 권한이 있는 경우 관리자 계정이 필요하지 않습니다.

결과를 먼저 확인하지 않고 파괴적인 코드(생성/수정/업데이트/삭제/이동/이름 바꾸기)를 수행하지 마십시오. 당신은 심각하게 부정적인 상황에 처하게 될 것입니다. 따라서 -WhatIf 또는 확인을 사용하는 것은 모든 경우에 사용해야 합니다.

Powershell 모범 사례 #8: WhatIf 사용 및 확인

Rename-Item -NewName ($_.Name -replace " ?\(\d\d\d\d_\d\d_\d\d \d\d_\d\d_\d\d UTC\)", "") -WhatIf

오류에 관해서는 이것을 너무 복잡하게 만들고 있습니다. 다음과 같이 단순화할 수 있습니다.

# Test create some test files
0..2 | 
ForEach-Object {New-Item -Path "D:\Temp\SomeFileName$PSItem(2020_11_23 09_41_34 UTC).txt" -WhatIf}
# Results
<#
What if: Performing the operation "Create File" on target "Destination: D:\Temp\SomeFileName0(2020_11_23 09_41_34 UTC).txt".
What if: Performing the operation "Create File" on target "Destination: D:\Temp\SomeFileName1(2020_11_23 09_41_34 UTC).txt".
What if: Performing the operation "Create File" on target "Destination: D:\Temp\SomeFileName2(2020_11_23 09_41_34 UTC).txt".
#>

# Create the test files
0..2 | 
ForEach-Object {New-Item -Path "D:\Temp\SomeFileName$PSItem(2020_11_23 09_41_34 UTC).txt"}
# Results
<#
    Directory: D:\Temp


Mode                 LastWriteTime         Length Name                                                                                                       
----                 -------------         ------ ----                                                                                                       
-a----         01-Dec-20     13:11              0 SomeFileName0(2020_11_23 09_41_34 UTC).txt                                                                 
-a----         01-Dec-20     13:11              0 SomeFileName1(2020_11_23 09_41_34 UTC).txt                                                                 
-a----         01-Dec-20     13:11              0 SomeFileName2(2020_11_23 09_41_34 UTC).txt  
#>

# Get files in path
(Get-ChildItem -Path 'D:\Temp' -Filter '*(2020_11_23 09_41_34 UTC)*').FullName
# Results
<#
D:\Temp\SomeFileName0(2020_11_23 09_41_34 UTC).txt
D:\Temp\SomeFileName1(2020_11_23 09_41_34 UTC).txt
D:\Temp\SomeFileName2(2020_11_23 09_41_34 UTC).txt
#>

# Delete the parens and all text between them
(Get-ChildItem -Path 'D:\Temp' -Filter '*(*').FullName | 
ForEach-Object {Rename-Item -Path $PSItem -NewName $($PSItem -replace '\(.*\)','') -WhatIf}
# Results
<#
What if: Performing the operation "Rename File" on target "Item: D:\Temp\SomeFileName0(2020_11_23 09_41_34 UTC).txt Destination: D:\Temp\SomeFileName0.txt".
What if: Performing the operation "Rename File" on target "Item: D:\Temp\SomeFileName1(2020_11_23 09_41_34 UTC).txt Destination: D:\Temp\SomeFileName1.txt".
What if: Performing the operation "Rename File" on target "Item: D:\Temp\SomeFileName2(2020_11_23 09_41_34 UTC).txt Destination: D:\Temp\SomeFileName2.txt".
#>

날짜 문자열에 대한 정규식이 정말로 필요한 경우 다음을 수행할 수 있습니다.

(Get-ChildItem -Path 'D:\Temp' -Filter '*(*').FullName | 
ForEach-Object {Rename-Item -Path $PSItem -NewName $($PSItem -replace '\(\d{4}|\d{2}.|_|UTC\)','') -WhatIf}

작업을 완료하고 변경 사항을 직렬화하려면 -WhatIf를 제거하세요.

관련 정보