#powershell #shell #loops #svg #inkscape
#powershell #оболочка #циклы #svg #inkscape
Вопрос:
Я написал простой скрипт в Windows powershell для перебора некоторых файлов SVG и внесения изменений в область страницы перед экспортом. Это работает хорошо, но относительно медленно. Поэтому я хотел попробовать использовать режим оболочки Inkscape, но я совершенно не понимаю, как заставить это работать. Я попробовал подход, используемый на этой странице https://inkscape.org/doc/inkscape-man.html но без удачи. Вот мой «рабочий, но медленный» скрипт, показывающий, что я пытаюсь сделать:
$files = Get-ChildItem "C:tempSVG Charts" -filter *.svg
# Starts a FOR loop which runs through each of the files from above
foreach ($f in $files){
# Prepare the name of the outputted file
# So you don't save over the originals
$outfile = $f.DirectoryName "Adjusted_" $f.BaseName ".svg"
# Run inkscape
# The export-area-drawing command below simply resets the print area of the SVG
inkscape $f.FullName --export-area-drawing --export-plain-svg $outfile
}
Ниже приведена моя попытка создать версию оболочки. Я думаю, что у меня цикл структурирован неправильно, и его нужно вывести inkscape --shell
за пределы цикла, однако затем он просто зависает, ожидая ввода. Если я помещу его в цикл, мне будет предложено ввести quit для каждой итерации, а затем появится много красного текста ошибки, который, я думаю, вероятно, связан со следующим пунктом… Кажется, существует несколько разных способов написания команд оболочки, и я даже не знаю, использую ли я правильный подход! Я изо всех сил пытаюсь решить последний вопрос, потому что я не знаю, правильно ли я настроил цикл для использования shell.
$files = Get-ChildItem "C:tempSVG Charts" -filter *.svg
# Starts a FOR loop which runs through each of the files from above
foreach ($f in $files){
# Prepare the name of the outputted file
# So you don't save over the originals
$outfile = $f.DirectoryName "Adjusted_" $f.BaseName ".svg"
# The export-area-drawing command below simply resets the print area of the SVG
inkscape --shell
file-open:$f.FullName; export-area-drawing; export-filename:$outfile; export-do
}
Мой вопрос: как я должен структурировать этот цикл Powershell и какой синтаксис я должен использовать для запуска команд оболочки?
Я использую относительно старую версию Inkscape, которая, без сомнения, не помогает: Inkscape 0.92.3
Комментарии:
1. Синтаксис командной строки значительно изменился между 0.92.5 и 1.0. Поэтому не обращайтесь к справочной странице, на которую вы ссылались, которая предназначена для текущей версии. Вместо этого найдите его в вашей установке Inkscape или в репозитории Inkscape по адресу gitlab.com/inkscape/inkscape/-/tree/INKSCAPE_0_92_3/man (или используйте более новую версию Inkscape).
Ответ №1:
Как предлагает Мойни, пожалуйста, обновите свою версию Inkscape. Я смог заставить это работать только с последней версией Inkscape 1.0.1:
# Avoid specifying long file paths in Inkscape commands...
Set-Location -Path 'C:TempSVG Charts'
# Build-up a list of actions to send to Inkscape...
[string]$actions = ''
$files = Get-ChildItem -Filter *.svg
foreach ($f in $files) {
$actions = "file-open:$($f.Name); export-area-drawing; export-filename:Adjusted_$($f.Name); export-do`r`n"
}
# Ensure to end your list of actions with 'quit', then pipe it to Inkscape...
"$actions`r`nquit" | amp; "C:Program FilesInkscapebininkscape.com" --shell
Я надеюсь, что этот короткий пример полезен.
Комментарии:
1. Большое спасибо, мне придется договориться с нашей ИТ-командой об обновлении версии Inkscape, которую они предоставляют нам