Если вы используете функцию привязки конвейера PowerShell, вы можете сделать это намного проще и устранить необходимость в явном Foreach-Object
напр .::1002*
ls *.gif | Move-Item -Destination {$_ -replace '\[|\]',''} -WhatIf
Это работает, потому что для параметра LiteralPath
установлено значение bind ByPropertyName
. Однако вы можете спросить, откуда оно получает свойство с именем «LiteralPath» на выходе Get-ChildItem
(псевдоним ls). Ну, он не находит это имя свойства, однако параметр LiteralPath
имеет определенный псевдоним PSPath
, который существует на каждом объекте, выводимом Get-ChildItem
. Вот как он связывается с параметром LiteralPath
. Другой совет по скорости заключается в том, что поскольку параметр Destination
также привязан к конвейеру (ByPropertyName), вы можете использовать scriptblock
для предоставления значения. И внутри этого скриптового блока у вас есть доступ к объекту конвейера.
Внутри скриптового блока используется оператор -replace
для создания нового имени на основе исходного полного имени. Хотя я мог бы использовать $_.FullName
или даже $_.Name
в этом случае (при условии, что вы хотите по существу переименовать файлы в том же каталоге), я использую просто $_
. Поскольку -replace
является строковым оператором, он будет приводить $_
к строке перед ее использованием. Вы можете увидеть, что это будет, выполнив:
ls *.gif | Foreach {"$_"}
Какой полный путь в этом случае, но вы должны быть осторожны, потому что вы не всегда получаете полный путь, например ::1010 *
ls | Foreach {"$_"}
отображает только имя файла. В ваших примерах (переименуйте в один и тот же каталог) это не имеет значения, но в других случаях это имеет значение. Вероятно, хорошей практикой будет просто быть явным и использовать $_.Name
или $_.FullName
в скрипте, но при взломе этого материала на консоли я обычно использую $_
. Поговорка: это острая палка, не высовывайте глаза применимо здесь. : -)