получить каталог с полным именем, переименовать каталог - PullRequest
0 голосов
/ 06 апреля 2020

Я хочу найти все файлы с более чем 256 символами в полном имени.

Из этих файлов я хочу переименовать папку.

На данный момент я нахожусь в этот момент

    $maxLength = 260
    $newPath = "a_path"

$paths = Get-ChildItem $newPath -force -Recurse | 
    Where-Object { ($_.FullName.Length -gt $maxLength) } |
    % {
     Write-Host $_.FullName
}

Но теперь я потерян.

  1. Я не могу понять, почему команда write-host $ paths больше не работает.
  2. Из полного имени мне нужен только каталог, я пытался получить его с помощью

    , выберите Каталог или Сплит-путь

Но это также не работает.

Как мне сказать «обрезать» имя каталога до $ maxLength = 260

Спасибо за несколько подсказок!

CYA_D0 c

Ответы [ 2 ]

0 голосов
/ 06 апреля 2020

Write-Host предназначен только для отправки текстовых символов на ваш терминал, будь то приглашение PowerShell или что-то еще, и вы не можете перехватить его в переменной, как пытаетесь это сделать.

Мы можем упростить ваш код до этого, чтобы получить только те пути, которые длиннее 260.

$paths = Get-ChildItem $newPath -force -Recurse | 
    Where-Object { ($_.FullName.Length -gt $maxLength) } | Select-Object -Expand Fullname   

, которые должны дать вам просто список слишком длинных каталогов, хранящихся внутри $paths. Вы можете экспортировать его в CSV-файл, например, так:

$paths | Export-Csv C:\PathTo\MyCooL.csv

И именно в этот момент вы должны сделать паузу и решить, как действовать.

Этот тип процесса часто пытаются и как улей мы решили, что это не идеальный кандидат для автоматизации. Вместо этого человек должен просмотреть список, а затем разумно принять правильное решение о переименовании каталогов.

Почему? Было бы очень легко сломать некоторые приложения, если бы ваш скрипт переименования запустил amuk, например, в C:\ProgramData\. Просматривая список, вы можете найти глубоко вложенные установки, содержащие распространяемые файлы Visual C ++ или другое важное содержимое. Вам нужно будет сделать правильный вызов, чтобы переименовать его, чтобы сделать это безопасно.

0 голосов
/ 06 апреля 2020
  1. Не могу понять, почему команда write-host $paths больше не работает.

Замените командлет Write-Host на Select-Object:

$maxLength = 260
$newPath = "a_path"
$paths = Get-ChildItem $newPath -Force -Recurse | Where-Object {$_.FullName.Length -gt $maxLength} | Select-Object -ExpandProperty FullName

$paths будет список желаемых полных путей.

Из полного имени мне нужен только каталог, я пытался получить его с помощью select Directory или Splith-Path. Но это также не работает.

Splith-Path сделает это:

$paths | Split-Path -Parent
Как мне сказать «обрезать» имя каталога до $ maxLength = 260

Это не так просто, как вы думаете. На какое имя ты хочешь его обрезать? Что, если урезанное имя каталога уже существует?

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

В чем ваша изначальная проблема? Вы все еще используете Windows 7 или старые продукты MS Office, максимальная длина пути которых не превышает 256?

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