необходимо сгенерировать UUID для системы Windows в ExtendScript - PullRequest
1 голос
/ 24 мая 2019

Я использовал приведенный ниже код для генерации DocumentID и InstanceID для ссылок файлов .indd. Это отлично работает на MacOS.

Может кто-нибудь предложить аналогичный код генерации UUID в системе Windows. Есть ли такая библиотека в системе Windows?

function generateUUID() {
  var cmd = 'do shell script "uuidgen | tr -d " & quoted form of "-"';
  return app.doScript(cmd, ScriptLanguage.applescriptLanguage);
}

var genDocID = 'xmp.did:' + generateUUID();

Ответы [ 2 ]

1 голос
/ 06 июня 2019

TLDR; Ниже приведено несколько способов генерации UUID в системе Windows с помощью ExtendScript API ...

  • Решение A "выдает" команду для Windows Powershell через VBScript. Однако это решение требует установки Windows PowerShell и разрешения на запуск VBScript.

  • Решение B использует сам InDesign для генерации UUID. Это достигается путем создания временного .indd документа и извлечения его DocumentID. Это решение успешно работает на кроссплатформенных платформах (как MacOS, так и Windows), не требует дополнительных зависимостей и является немного более производительным, чем Solution A , поскольку ему не нужно переключаться между различными языками кодирования в отличие от Solution A , который делает.


Решение A:

Оболочка по умолчанию в Windows, а именно cmd.exe, не предоставляет встроенную утилиту для генерации универсального уникального идентификатора (UUID). Это отличается от утилиты Bash uuidgen , которая доступна на MacOS и других * nix платформах.

Однако можно сгенерировать UUID через Windows , выполнив следующую команду:

[guid]::Newguid()

В следующем Adobe ExtendScript (win-generate-uuid.jsx) показано, как можно сгенерировать UUID с помощью вышеупомянутой команды PowerShell.

Примечание : Для этого решения требуется:

  • Windows PowerShell для установки.
  • Windows разрешено запускать .

обоюдного генерировать-uuid.jsx

/**
 * Generates a unique identifier (UUID/GUID) by running a VBScript that
 * executes a PowerShell command.
 * @returns {String} - The generated unique identifier.
 */
function generateUUID() {
  var pwshCmd = '$guid = [guid]::Newguid(); $guid = [string]$guid';
  var vbScript = [
    'CreateObject("WScript.Shell").Run "powershell.exe -command ""' +
        pwshCmd + '"" | clip", 0, True',
    'guid = CreateObject("htmlfile").ParentWindow.ClipboardData.GetData("text")',
    'returnValue = Replace(guid, "-","")'
  ].join('\r');

  return app.doScript(vbScript, ScriptLanguage.visualBasic);
}

var genDocID = 'xmp.did:' + generateUUID();
$.writeln(genDocID);

Пояснение:

  1. Функция generateUUID в win-generate-uuid.jsx использует метод InDesign doScript() для запуска VBScript.

  2. VBScript, который выполняется, по сути, запускает вышеупомянутую команду PowerShell (хотя и слегка измененную версию), используя команду Run().

    Примечание: Необходимо использовать VBScript для "shell out" команды PowerShell, поскольку InDesign, работающая в Windows, позволяет выполнять только VBScript или JavaScript с помощью метода doScript.

  3. Результат команды PowerShell (т.е. сгенерированный UUID) передается по каналу (|) в буфер обмена.

  4. Впоследствии;

    • UUID извлекается из буфера обмена.
    • Все переносы (-) в сгенерированном UUID удаляются, прежде чем, наконец, return передать его сценарию .jsx.
  5. Для дальнейшего объяснения причин, по которым VBScript Run() используется (в сочетании с передачей в буфер обмена) вместо Exec() VBScript, см. этот ответ . Краткое изложение причин:

    • Run() не показывает окно PowerShell.
    • Exec() кратко отображает окно PowerShell.

Решение B:

Кроссплатформенное решение для генерации UUID (т.е. успешно работающее на MacOS и Windows) заключается в использовании самого InDesign. Это продемонстрировано в generate-uuid.jsx ниже.

генерировать-uuid.jsx

#target indesign

$.level=0

/**
 * Loads the AdobeXMPScript library.
 * @returns {Boolean} True if the library loaded successfully, otherwise false.
 */
function loadXMPLibrary() {
  if (!ExternalObject.AdobeXMPScript) {
    try {
      ExternalObject.AdobeXMPScript = new ExternalObject('lib:AdobeXMPScript');
    } catch (e) {
      alert('Failed loading AdobeXMPScript library\n' + e.message, 'Error', true);
      return false;
    }
  }
  return true;
}

/**
 * Generates a unique identifier (UUID/GUID) cross-platforms (macOS/Windows).
 * @returns {String} - The generated unique identifier.
 */
function generateUUID() {
  var tmp_FilePath = File(Folder.temp + '/__temp__.indd');

  // 1. Create temporary .indd and save it to disk.
  var newDoc = app.documents.add(false);
  newDoc.save(tmp_FilePath);
  newDoc.close();

  // 2. Extract the DocumentID from temporay .indd
  var xmpFile = new XMPFile(tmp_FilePath.fsName, XMPConst.FILE_INDESIGN, XMPConst.OPEN_FOR_READ);
  var xmp = xmpFile.getXMP();
  var documentID = xmp.getProperty(XMPConst.NS_XMP_MM, 'DocumentID', XMPConst.STRING);

  // 3. Delete temporary .indd
  tmp_FilePath.remove();

  // 4. Return the DocumentID without the default `xmp.did:` prefix.
  return String(documentID).replace(/xmp\.did:/g, '');
}


if (loadXMPLibrary()) {
   var genDocID = 'xmp.did:' + generateUUID();
   $.writeln(genDocID);
}

Пояснение:

Сценарий generate-uuid.jsx (см. Выше) содержит функцию с именем generateUUID, которая по существу выполняет следующее:

  1. Создает новый документ InDesign (.indd) и сохраняет его во временной папке ОС, а затем закрывает его. Эта задача выполняется в фоновом режиме, поэтому пользователь не будет знать, что фактический документ был создан.

    Примечание Временный каталог по умолчанию для ОС определяется через Folder.temp. Чтобы лучше понять, где находится временная папка для каждой операционной системы, вы можете временно добавить следующую строку кода в ваш скрипт и записать свой путь в консоль ExtenScript:

    $.writeln(Folder.temp);
    
  2. Далее мы извлекаем DocumentID из вновь созданного временного файла .indd, используя функции API сценариев XMP - с которым вы должны быть знакомы из моих ответов на ваши предыдущие вопросы; здесь , здесь и здесь .

  3. Затем мы удаляем временный .indd файл с именем __temp__.indd.
  4. Наконец, префикс xmp.did: по умолчанию из извлеченного documentID удаляется.

    Примечание: Префикс xmp.did: по умолчанию удаляется в телефункция generateUUID затем восстановлена ​​- что может показаться немного странным!Я сделал это намеренно, чтобы generateUUID оставался более пригодным для повторного использования.Например;вы можете использовать его для генерации InstanceID и т. д., в этом случае вы, вероятно, захотите добавить префикс UUID к xmp.iid:.

0 голосов
/ 07 июня 2019

Я использовал приведенную ниже простую функцию JS, чтобы избежать проблемы с Mac и Windows и иметь несколько функций для нее.

// JS - Generate Global Random Unique Number
function generateJsUUID(){
    var dt = new Date().getTime();
    var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
        var r = (dt + Math.random()*16)%16 | 0;
        dt = Math.floor(dt/16);
        return (c=='x' ? r :(r&0x3|0x8)).toString(16);
    });
    return uuid;
}
...