PowerShell изменить расширение - PullRequest
0 голосов
/ 06 сентября 2018

У меня проблема с изменением расширения файла. Мне нужно написать скрипт, который реплицирует данные, но у данных есть два файла. Имя файла не является строкой, поэтому мы не можем использовать обычный -replace

Мне нужно получить от

filename.number.extension

эта форма

filename.number.otherextension

Мы пытаемся использовать разбиение, но эта команда показывает нам такие вещи, как показано ниже

filename
number
otherextension

Спасибо за любые идеи,

Ответы [ 3 ]

0 голосов
/ 06 сентября 2018

Вы можете удалить последний элемент с помощью среза [0 ..- 1] и добавить новое расширение к этому

(("filename.number.extension" -split "\.")[0..-1] -join '.') +".otherextension"
0 голосов
/ 14 июня 2019

Простая служебная функция

<#
 # Renames all files under the given path (recursively) whose extension matches $OldExtension.
 # Changes the extension to $NewExtension
 #>
function ChangeFileExtensions([string] $Path, [string] $OldExtension, [string] $NewExtension) {
    Get-ChildItem -Path $Path -Filter "*.$OldExtension" -Recurse | ForEach-Object {
        $Destination = Join-Path -Path $_.Directory.FullName -ChildPath $_.Name.Replace($OldExtension, $NewExtension)
        Move-Item -Path $_.FullName -Destination $Destination -Force
    }
}

Использование

ChangeFileExtensions -Path "c:\myfolder\mysubfolder" -OldExtension "extension" -NewExtension "otherextension"

Но он может сделать больше, чем просто это. Если у вас были следующие файлы в той же папке, что и ваш скрипт

    example.sample.csv
    example.txt
    mysubfolder/
        myfile.sample.csv
        myfile.txt

этот сценарий переименует все файлы .sample.csv в файлы .txt в данной папке и во всех подпапках и перезапишет любые существующие файлы с этими именами.

# Replaces all .sample.csv files with .txt extensions in c:\myfolder and in c:\myfolder\mysubfolder
ChangeFileExtensions -Path "c:\myfolder" -OldExtension "sample.csv" -NewExtension "txt"

Если вы не хотите, чтобы он был рекурсивным (влияющим на подпапки), просто измените

"*.$OldExtension" -Recurse | ForEach-Object

до

"*.$OldExtension" | ForEach-Object
0 голосов
/ 06 сентября 2018

Вы, вероятно, хотите что-то вроде оператора -replace:

'filename.number.extension' -replace 'extension$','otherextension'
  • $ - это синтаксис регулярного выражения, означающий конец строки . Это должно гарантировать, что -replace не соответствует «расширению», появляющемуся в другом месте в имени файла.
...