Найти в Дзене
Тонкости Renga

Часть 3. Открытие проекта. Сохранение проекта с помощью скрипта под другим именем.

Запускать приложение Renga мы уже умеем, создавать новый проект тоже. Но для автоматизации каких-то операций чаще всего приходится не создавать проекты, а открывать существующие и в них уже производить манипуляции с данными. Эта статья посвящена написанию скриптов, манипулирующих проектом Renga. Кроме этого мы научимся с помощью API Renga обрабатывать ошибки открытия файлов, их сохранения и закрытия. Также узнаем несколько новых служебных слов PowerShell. С помощью первого скрипта мы откроем существующий проект и сохраним его под другим именем. Создадим в Renga новый проект и сохраним его, например, на диск D: под именем test.rnp. Если у вас нет такого диска, выберите любой другой, который есть у вас на компьютере (например, C:) и используйте его, только не забудьте заменить букву диска в приведенных далее примерах. Напишем и сохраним под именем “Открыть и сохранить как.ps1” следующий скрипт: Разберем его по строкам. 1. Первая строка уже нам известна по предыдущей части - создаем COM-

Запускать приложение Renga мы уже умеем, создавать новый проект тоже. Но для автоматизации каких-то операций чаще всего приходится не создавать проекты, а открывать существующие и в них уже производить манипуляции с данными. Эта статья посвящена написанию скриптов, манипулирующих проектом Renga. Кроме этого мы научимся с помощью API Renga обрабатывать ошибки открытия файлов, их сохранения и закрытия. Также узнаем несколько новых служебных слов PowerShell.

С помощью первого скрипта мы откроем существующий проект и сохраним его под другим именем.

Создадим в Renga новый проект и сохраним его, например, на диск D: под именем test.rnp. Если у вас нет такого диска, выберите любой другой, который есть у вас на компьютере (например, C:) и используйте его, только не забудьте заменить букву диска в приведенных далее примерах.

Напишем и сохраним под именем “Открыть и сохранить как.ps1” следующий скрипт:

Разберем его по строкам.

1. Первая строка уже нам известна по предыдущей части - создаем COM-объект Renga и запускаем программу.

2. В следующих двух строках создаем переменные $FN и $FNN в которые записываем имя файла, который будем открывать, включая путь к нему - $FN, а также имя файла, которое назначим при сохранении проекта $FNN.

3. Далее известный нам блок try – finally, внутри которого и происходит открытие и сохранение файла с новым именем.

4. Немного подробнее о содержимом блока try – finally

Ранее мы показывали Renga пользователю ($renga_app.Visible = $true;), сейчас же в этом нет необходимости, поэтому мы оставляем Renga скрытой. Но если вам хочется увидеть процесс открытия файла и дальнейшей работы с ним, добавьте эту строку в скрипт.

$result = $renga_app.OpenProject($FN) – открываем проект, передав в метод OpenProject имя файла, которое у нас хранится в переменной ($FN). При этом мы обработаем возможность ошибки при открытии файла. Например, если мы ошибемся в написании имени или пути к файлу, то открывать будет нечего и возникнет ошибка. Также может возникнуть ошибка при открытии файла, если он был поврежден и т.п. Проверить отрылся проект или нет можно с помощью переменной $result. В эту переменную метод OpenProject($FN) возвращает 0, если проект удалось открыть и значение отличное от 0 в случае ошибки.

if ($result -eq 0) – эта конструкция проверяет равна ли переменная $result нулю, т.е. открылся ли проект. В PowerShell для проверки на равенство используется выражение -eq. Нельзя использовать символы = или ==. Подробнее можно почитать, например, здесь https://docs.microsoft.com/ru-ru/powershell/scripting/learn/deep-dives/everything-about-if?view=powershell-7.2.

Текст после данной конструкции, начинающийся с символа # - является комментарием PowerShell и будет игнорироваться при выполнении скрипта.

Если проект открылся, выполняется блок в фигурных скобках, следующий за конструкцией if ($result -eq 0), если же возникла ошибка, сообщаем об этом в блоке в фигурных скобках, следующем за служебным словом else, расположенном ниже фигурных скобок блока.

$project = $renga_app.Project; - создаем переменную $project и присваиваем ей значение свойства приложения $renga_app.Project, которое представляет собой проект Renga. Таким образом мы можем далее работать непосредственно с проектом Renga.

$project.SaveAs($FNN,0,$true); - для того, чтобы сохранить проект под другим именем используем уже методы проекта. В данном случае вызывается метод SaveAs, в который передается три параметра: новое имя - $FNN, далее, через запятую нужно ввести параметр как именно вы хотите сохранить проект, как новый проект (параметр равен 0), или как шаблон проекта (параметр равен 1), последний передаваемый параметр указывает перезаписывать ли нам файл, если он уже существует. В нашем случае $true означает, что мы предполагаем перезаписать файл. Ошибку сохранения обрабатываем по аналогии с обработкой при открытии проекта.

5. В следующей строке обращаемся к методу приложения $renga_app.CloseProject($true), который закрывает открытый нами ранее проект. В качестве входного параметра необходимо передать логическое значение, которое определит игнорировать ли нам сделанные изменения. Так как никаких изменений в проекте после того как сохранили его под другим именем мы не делали, то и сохранять нам больше нечего, поэтому передаем в метод $true, что и означает игнорировать сделанные изменения и закрыть проект. Ошибки при закрытии обрабатываем уже известным нам способом.

6. После блока try – finally как мы уже знаем, Renga просто закрывается.

Запустим скрипт и посмотрим результат его выполнения в окне PowerShell (см. рисунок) и на диске - будет создан файл "test_new.rnp". Открыв его, убедимся, что это копия созданного нами файла "test.rnp"

Результат выполнения скрипта
Результат выполнения скрипта

В качестве эксперимента, задайте новому имени файла некорректный путь, например, несуществующий на вашем компьютере диск J: и запустите скрипт на выполнение. Убедитесь, что обработается ошибка сохранения файла;

В следующем скрипте немного усложним задачу.

Чтобы каждый раз в скрипт не вписывать имя файла, который нужно открыть, предложим его выбрать при запуске скрипта. Далее, чтобы не спрашивать имя файла для сохранения, просто добавим к имени открытого файла «_new».

Первая часть задачи – запрос файла, решается добавлением следующих строк кода в начало скрипта:

Традиционный разбор по срокам.

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

Add-Type -AssemblyName System.Windows.Forms

Далее создаем переменную f, которая и будет отвечать за диалоговое окно выбора файла и присвоим ей созданный объект формы выбора файла Windows.Forms.OpenFileDialog. Объект создается уже известной нам командой new-object

На следующем шаге настраиваем наше окно выбора файла.

Устанавливаем папку в которой нужно искать файл на текущую папку: $f.InitialDirectory = (Get-Location).Path

Настраиваем фильтр для того, чтобы выбирать только файлы Renga (также добавляем в фильтр возможность выбора всех файлов (*.*), на случай если случайно сохранили проект без расширения): $f.Filter = "Renga project (*.rnp)|*.rnp|All Files (*.*)|*.*"

Разрешаем показывать кнопку «Справка» в окне: $f.ShowHelp = $true и устанавливаем ограничение выбирать не более одного файла: $f.Multiselect = $false

[void]$f.ShowDialog() – вызывает диалоговое окно, в котором мы и выбираем файл Renga.

Подробнее о параметрах диалогового окна выбора файла можно почитать в справке по .Net, например здесь https://docs.microsoft.com/ru-ru/dotnet/api/system.windows.forms.openfiledialog?view=windowsdesktop-6.0

Следующие две строки проверяют, выбрали ли мы файл. Если не выбрали ни одного файла, выходим из скрипта:

if (!$f.Multiselect) {$FN = $f.FileName } else { return}

if ($FN -eq "") {return};

Если файл был выбран, то он будет записан в переменную $FN.

Вторая часть задачи – необходимо переименовать файл, добавив к имени файла строку “_new”. Добавим несколько строк, решающих эту задачу в скрипт:

Первая строка отвечает за получение полного пути к выбранному нами файлу, включая его имя: $filepath = Get-ChildItem $FN;

Вторая строка выделяет папку, в которой расположен файл: $Filedir = Split-Path -Path $FN;

Следующая строка формирует новое имя файла, добавляя к имени строку “_new” и расширение файлов Renga“.rnp”: $FNT = $filepath.BaseName +"_new"+".rnp";

Финальная строка создает полный путь к новому файлу, соединяя имя файла и путь к папке. Далее просто скопируем строки из предыдущего скрипта, за исключением строк, в которых мы указывали имена файлов:

Запустив скрипт, выберем любой имеющийся файл проекта Renga, например, созданный ранее "test.rnp", и убедимся, что рядом с этим файлом появился новый файл, имя которого сформировано из имени выбранного с добавлением суффикса «_new» - в нашем случае "test_new.rnp".

Для тех, кому лучше один раз увидеть, видео, демонстрирующее создание описанных выше скриптов.