powershell изменяют имя файла, использующее сначала 10 символов и маску

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

$directory = 'c:\temp'
Get-ChildItem $directory
Dir $directory | Rename-Item –NewName { $_.name –replace "-"," " }
Dir $directory | Rename-Item –NewName { $_.name –replace "_"," " }
dir $directory |
    % {rename-item -path $_.fullname -newname ( ($_.name.split(' ')[0..2] -join '-' ) + $_.Extension )}

Пользователи помещают файлы, которые будут заархивированы в папке. Файлы, как предполагается, называют с числом задания в начале имени файла, таким образом, они похожи: 99-99-9999 (всегда 10 символов) у Них есть опция поместить описание позади того числа задания, таким образом, файл может быть похожим:

99-99-9999 - some descrition.txt

Описание будет варьироваться и может содержать любой символ с обязательного начала. Я хотел бы переименовать файл с помощью первых 10 символов. Я также хотел бы смочь удостовериться, что сценарий не работает, если первые 10 символов не находятся в этом формате.

Я думал, что был на правильном пути с: $newname = $list.Name.Substring(0,10) но я не могу заставить это работать.

Редактирование - я - один шаг ближе. Я нашел, что этот код изменит имя файла, использующее сначала 10 символов.

gci -Path "c:\temp" | rename-item -newname { [string]($_.name).substring(0,10)}

Я теперь должен найти, что способ отфильтровать добирается-childitems так, он только обрабатывает объекты с моим шаблоном файла.

0
задан 6 June 2015 в 03:25
2 ответа

Вы встречали регулярные выражения? Маски сопоставления с образцом.

^ matches from the start of a string
\d matches a digit 0-9
{2} matches something twice

Итак:

gci 'c:\temp' |? Name -match '^\d{2}-\d{2}-\d{4}' | ren -N { $_.SubString(0,10)+$_.Extension }

Будет соответствовать желаемому образцу и переименовывать их, чтобы удалить описание, игнорируя остальное.

Или:

gci 'c:\temp' |? Name -match '^\d{2}.\d{2}.\d{4}' | ren -N { 
    ($_.Name -replace '^(\d\d).(\d\d).(\d\d\d\d).*','$1-$2-$3')+$_.Extension
}

Разрешит любой другой символ между числами, например Подчеркивание.

2
ответ дан 4 December 2019 в 12:27

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

$directory = 'c:\test'

# Get files only
$dirs = Get-ChildItem $directory | where {$_.psiscontainer -eq $false}

#loop through each file name
foreach ($d in $dirs){

    $jobNum = $d.Name.Substring(0,10) –replace("_", "-") 
    $comment = ($d.Name.Substring(10, $d.Name.length - 10))
    Rename-Item $d.FullName "$jobNum - $comment"

}
1
ответ дан 4 December 2019 в 12:27

Теги

Похожие вопросы