在Photoshop脚本中保存每个用户或每个文档的偏好设置

9
我正在使用ExtendScript编写JavaScript中的Photoshop脚本。我的脚本允许一些用户输入,并且我想在使用之间保存它们。也就是说,我正在寻找一种方法来保存一个特定键下的简单字符串或数字值,以便我能够在脚本的后续使用中访问它。简单地说,我想为我的脚本保存一个首选项。如何实现这一点?
更好的是,能否按文档保存至少一些首选项?那可能吗?也就是说,我可以将任意数据与文档一起存储吗?

也许 https://indisnip.wordpress.com/2010/09/07/storing-custom-data-into-indesign-file-xmp/ 也适用于这里? - Tobias Kienzler
3个回答

13

您可以使用put/get自定义选项来保存偏好参数,这些参数在Photoshop启动时保持不变:

const kMyFlag = app.stringIDToTypeID( "myFlag" );
const kMyNumber = app.stringIDToTypeID( "myNumber" );
const kMySettings = "mySettings";

function saveSettings()
{
  var desc = new ActionDescriptor();
  desc.putBoolean(kMyFlag, true);
  desc.putInteger(kMyNumber, 42);

  // "true" means setting persists across Photoshop launches.
  app.putCustomOptions( kMySettings, desc, true );
}

function getSettings()
{
  var desc = app.getCustomOptions( kMySettings );
  return [desc.getBoolean( kMyFlag ), desc.getInteger( kMyNumber )];
}

编辑了示例以显示同一描述符上的多个值。 - J. Peterson
以防其他人在寻找适用于indesign的解决方案时发现此内容:您可以使用app.insertLabel和app.extractLabel来存储您的首选项。 - ChristophK
这个解决方案在 macOS 上可行吗?根据 getCustomOptions 文档,“检索 Photoshop 注册表中 ID 值为 key 的用户对象”,由于我了解到 mac 不使用注册表,因此提出了这个问题。我没有 mac,所以无法测试。 - deggen
所提到的“注册表”是 Photoshop 内部的,因此它适用于 Mac 和 Windows。 - J. Peterson
这是一个新手问题: ActionDescriptor应该是用来做什么的?保存偏好设置吗?在Illustrator中,我们有专门用于此目的的Preferences - Hendra Anggrian
在Photoshop中,ActionDescriptor是一种通用的结构,用于从脚本传递事件和相关数据到应用程序。存储首选项是其中之一,还有许多其他用途。 - J. Peterson

7
您有几种选择。您可以使用File对象创建文本文件并写入其中:
var prefs = new File("~/desktop/prefs.txt");
prefs.open("w"); // or "a" to append
prefs.writeln("user:lenny;favorite_color:ff6600;likes:sunsets;");

如果你希望将个人喜好与脚本相关联,可以进行如下设置。
如果你想要每个文档的个性化偏好设置,可以使用 Document.info 将字符串写入文件的元数据字段之一(例如 'instructions' 字段),示例如下:
var doc = app.activeDocument;
doc.info.instructions = "user:lenny;favorite_color:ff6600;likes:sunsets;";
//alert(doc.info.instructions); // see, it works!

关于如何实际格式化字符串,您可以像简单的配置文件一样执行它。如果您有一个复杂的用户首选项对象,则可以使用XML对象构建并序列化它。 JSON很适合这个任务,但不幸的是,在Extendscript中没有JSON对象。


1

对于每个文档的首选项,我建议使用XMP元数据。你可以在这里找到示例代码:http://forums.adobe.com/thread/790973。你可以利用AdobeXMPScript库创建自己的命名空间,就像Paul Riggott在链接中建议的那样。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接