Цикл оболочки Inkscape из Windows powershell

#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, которую они предоставляют нам