Редактирование текстового файла внутри скрипта PowerShell - PullRequest
0 голосов
/ 02 ноября 2019

Я сделал скрипт Powershell для обновления моих mpv-скриптов. Одним из них является https://raw.githubusercontent.com/mpv-player/mpv/master/player/lua/osc.lua. Я хочу, чтобы скрипт редактировал и удалял все экземпляры show_message(get_playlist(), 3) из файла.

Я пробовал (get-content .\Scripts\osc.lua) | foreach-object {$_ -replace "show_message(get_playlist(), 3)", ""} | Out-File .\Scripts\osc.lua и (get-content .\portable_config\Scripts\osc.lua) | foreach-object {String.Replace [RegEx]::Escape('show_message(get_playlist(), 3)'),''} | Out-File .\portable_config\Scripts\osc.lua, но, похоже, они не работают.

По сути, я хочу, чтобы скрипт автоматически загружал osc.lua (работает нормально, как задумано), а затем удалял все экземпляры show_message(get_playlist(), 3) из файла. Моя версия PowerShell 5.1.

1 Ответ

0 голосов
/ 03 ноября 2019

С оператором Replace можно использовать следующее:

$regex = [regex]::Escape('show_message(get_playlist(), 3)')
(Get-Content .\Scripts\osc.lua) -replace $regex |
    Set-Content .\Scripts\osc.lua

В качестве альтернативы можно использовать метод String.Replace из класса String, который не использует регулярное выражение .

(Get-Content .\Scripts\osc.lua).Replace('show_message(get_playlist(), 3)','') |
    Set-Content .\Scripts\osc.lua

Объяснение:

При использовании оператора -replace соответствующийМеханизм - это регулярное выражение. Некоторые символы являются метасимволами для регулярных выражений и должны быть экранированы, прежде чем их можно будет интерпретировать буквально. В этом случае ( и ) необходимо экранировать. Вы можете сделать это вручную с помощью \ (\( и \)) или использовать метод Escape() из класса Regex. Из приведенного выше кода вы можете набрать $regex после его объявления и посмотреть, как оно было экранировано.

При замене строки пустой строкой вам не нужно указывать строку замены. 'String' -replace 'ing' имеет те же результаты, что и 'String' -replace 'ing',''


Примечание: Вы смешиваете Get-Content и Out-File в своем коде без использования параметра -Encoding. Возможно, вы могли бы вывести другую кодировку, чем исходный файл. Если это важно для вас, я бы предложил использовать параметр -Encoding с соответствующей кодировкой.

...