ファイル名から (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 または Confirm を使用する必要があります。

Powershell ベスト プラクティス #8: WhatIf と Confirm を使用する

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 を削除します。

関連情報