2016-03-18 4 views
2

Итак, я много читал о проблемах Square Bracket [] с переименованием файла с Powershell. Большинство из этих сообщений говорили об удалении скобок. Мне нужно сохранить скобки и просто удалить расширение файла .crypted(CryptoLocker). Есть 400 000+ файлов и 172 000 + папок. Я попробовал Move-Item командлет ...PowerShell с квадратными скобками

Get-ChildItem c:\temp *.crypted | Move-Item -LiteralPath {$_.FullName.Replace(".crypted", "")} 

Я получаю ошибку Move-Item : Cannot move item because the item at 'C:\temp\Rule [1].txt' does not exist

Как вы могли бы увидеть новый правильный путь, но он говорит, что не существует. Я в тупике. Любая помощь будет принята с благодарностью.

+0

ли вы пробовали 'переименовывать-item' Командлет? –

+0

@jisaak Командлет 'rename-item' терпит неудачу из-за скобок и отсутствия' -LiteralPath'. Это была первоначальная необходимость переключиться на '-Move-Item'. [] Являются подстановочными знаками внутри powershell. – KMckenzie

ответ

0

Отладочный совет: Если у вас возникли проблемы с кодом, и вы используете конвейер, перепишите код, чтобы не использовать конвейер, а также устраните проблему и выполните отладочные средства, чтобы помочь устранить неполадки. Может быть Write-Host, сэкономить на временные переменные и т. Д.

Для меня ваш Move-Item как написано не работает, и я получаю подобное сообщение об ошибке.

Вот что я прибыл в качестве решения:

Get-ChildItem *.crypted | ForEach-Object {Move-Item -LiteralPath $_.FullName $_.FullName.Replace('.crypted', '')} 

Обратите внимание, что я прохожу 2 аргументов Move-Item после -LiteralPath, и нет необходимых обратных кавычек или что-нибудь из ряда вон выходящего.

Вот моя работа, чтобы продемонстрировать проблему и мое решение.

D:\test\move> dir 


    Directory: D:\test\move 


Mode    LastWriteTime   Length Name 
----    -------------   ------ ---- 
-a----  3/17/2016 9:21 PM   100347 file [1].pdf 


D:\test\move> Get-ChildItem *.pdf | Move-Item -LiteralPath {$_.FullName.Replace('1', '2')} 
Move-Item : Cannot move item because the item at 'D:\test\move\file [2].pdf' does not exist. 
At line:1 char:23 
+ ... ldItem *.pdf | Move-Item -LiteralPath {$_.FullName.Replace('1', '2')} 
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : InvalidOperation: (:) [Move-Item], PSInvalidOperationException 
    + FullyQualifiedErrorId : InvalidOperation,Microsoft.PowerShell.Commands.MoveItemCommand 

D:\test\move> Get-ChildItem *.pdf | ForEach-Object {Move-Item -LiteralPath $_.FullName $_.FullName.Replace('1', '2')} 
D:\test\move> dir 


    Directory: D:\test\move 


Mode    LastWriteTime   Length Name 
----    -------------   ------ ---- 
-a----  3/17/2016 9:21 PM   100347 file [2].pdf 

Работы по РАСШИРЕНИЯ тоже ...

D:\test\move> dir 


    Directory: D:\test\move 


Mode    LastWriteTime   Length Name 
----    -------------   ------ ---- 
-a----  3/17/2016 9:21 PM   100347 file [2].txt.crypted 


D:\test\move> Get-ChildItem *.crypted | ForEach-Object {Move-Item -LiteralPath $_.FullName $_.FullName.Replace('.crypted', '')} 
D:\test\move> dir 


    Directory: D:\test\move 


Mode    LastWriteTime   Length Name 
----    -------------   ------ ---- 
-a----  3/17/2016 9:21 PM   100347 file [2].txt 


D:\test\move> 
+0

Это решение. Я устал использовать «ForEach-Object», но я тоже что-то пропустил. Я ценю помощь и дополнительное руководство. Это был тщательно проверенный ответ, и у меня не было никаких проблем, чтобы он работал в моей ситуации. – KMckenzie

2

Для того, чтобы работать вокруг скобок, избежать его с двойной кавычкой `` как так,

gci c:\temp\brackets *.crypted | % { 
    move-item $_.FullName.replace('[','``[') $_.FullName.Replace(".crypted", "") 
} 

Удвоения Открывающей кавычки необходим, так что кавычка передается и не интерпретируется как экранирующий символ скобки. Это немного грязно, так что это похоже на ошибку в Powershell или очень удивительное поведение.

+0

Если вы используете '-LiteralPath', вам не нужно использовать обратные ссылки, и вы можете избежать написания * грязного * кода. Я также показываю, почему исходная команда OPs выдала ошибку. –

+0

@vonPryz Это решение работает тоже. Спасибо за вашу помощь. Хотя опция '-LiteralPath' является более чистым способом, я также могу использовать ее в будущем и очень ценю помощь. – KMckenzie

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