Изменить кодировку и расширение файлов в каталоге с помощью powershell - PullRequest
0 голосов
/ 21 мая 2018

Я пытался написать скрипт для изменения кодировки и расширения файла для группы файлов в определенном каталоге, но безрезультатно.До сих пор методы get-content и set-content работали, но только для отдельных файлов (не запустили его в цикл).

т.е.

get-content testdocument.txt | set-content -encoding utf8 "testdocument.xml" 
#works!

т.е.

$a = dir |
    $a foreach-object |
        get-content | set-content -encoding utf8 $a_fullname.xml
#doesn't work =(

У меня также был успех (ограниченный) с командлетом rename-item.Я могу переименовать все элементы в каталоге, но не могу изменить кодировку.

т.е.

get-childitem *.txt | rename-item -newname {$_.name -replace '.txt','.xml'} 
#works!

т.е.

get-childitem *.txt | rename-item -newname {$_.name -replace '.txt','.xml'} | -encoding utf8
#doesn't work =(

Любая помощь будетбыть высоко ценится.Я прошу прощения, если этот вопрос кажется тривиальным (плохо знакомым с Powershell / сценариями в целом, также впервые публикуется).Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

Чтобы ответить на ваши вопросы, вы используете неверный синтаксис для большинства ваших команд.Я бы посоветовал взглянуть на Get-Command -Name Get-Help -Syntax и Get-Help -Name Get-Command (замените -Name на используемый вами командлет).

  1. Rename-Item предназначен только для переименования .. элементов.Он не меняет кодировку.

  2. ForEach-Object используется по двум причинам: для перебора коллекции и получения значения элемента или для выполнения действия для элемента.В вашем случае:

Get-ChildItem -Path 'C:\myfiles' |
    ForEach-Object {
        # Wrapping in parens prevents filelocking
        (Get-Content -Path $_.FullName) |
            Set-Content -Path $_.FullName -Encoding UTF8
        Rename-Item -NewName "$($_.BaseName).xml" -Path $_.FullName
    }
0 голосов
/ 21 мая 2018

Для вашего цикла вам нужно модульно настроить ваши команды, чтобы вы могли ссылаться на них и вызывать их правильно.В вашем случае, вместо того, чтобы вызывать свойство «fullName», вам нужно вызывать «baseName» и добавлять к нему «.xml» в исходной команде, которая работает.После этого простое использование правильных переменных в нужных местах в цикле ForEach заставит его работать.

$a = Get-ChildItem
ForEach ($item in $a) {
  Get-Content $item.FullName | Set-Content -Encoding utf8 "$($item.Basename).xml"
}

Это позволит вам иметь исходные файлы рядом с новыми XML-файлами с соответствующей кодировкой.

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