Рекурсивное переименование файлов в Powershell - PullRequest
9 голосов
/ 25 августа 2011

Вызов этой команды powershell и получение ошибки. Сводит меня с ума.

Prompt> get-childitem -recurse ./ *NYCSCA* |  where-object { $_.Name -like
 "*NYCSCA*" } |  rename-item $_ -newname $_.Name.Replace(" ","_") -whatif

Вот ответ:

You cannot call a method on a null-valued expression.
At line:1 char:140
+ get-childitem -recurse ./ *NYCSCA* |  where-object { $_.Name -like "*NYCSCA*" } | select FullName | rename-item $_ -n
ewname $_.Name.Replace <<<< (" ","_") -whatif
    + CategoryInfo          : InvalidOperation: (Replace:String) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull

Если я удаляю последнюю часть, я получаю список файлов. Есть какие-нибудь подсказки? Я еще не взломал PowerShell, очевидно.

Примечание: я пытался опубликовать это в суперпользователе, но сайт постоянно терпит неудачу - не позволю мне добавить этот точный вопрос.

Здесь это сильно упрощено. Я даже не могу заставить этот классический пример работать.

gci  *NYCSCA*  | ren $_ ($_.Name).Replace("foo","bar")

Спасибо, @JNK,% сделал это. Решение, в котором я нуждался, заключается в следующем, если вам интересно:

gci -recurse | where-object{ $_.Name -like "*NYCSCA*"} | %{rename-item $_.FullName $_.FullName.Replace("NYCSCA","SDUSD") }

Ответы [ 2 ]

8 голосов
/ 25 августа 2011

Я думаю, вам нужен foreach-объект:

get-childitem -recurse ./ *NYCSCA* |  where-object { $_.Name -like
 "*NYCSCA*" } | % {rename-item $_ -newname $_.Name.Replace(" ","_") -whatif}

Не удалось переименовать конвейерный массив как набор.

5 голосов
/ 25 августа 2011

Вот упрощенная версия для переименования только файлов

Get-ChildItem -Filter *NYCSCA* -Recurse |
 Where-Object {!$_.PSIsContainer} | 
 Rename-Item -NewName { $_.Name.Replace(' ','_') } -WhatIf

( Изменить: для ясности добавлены разрывы строк )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...