TLDR; Ниже приведено несколько способов генерации UUID в системе Windows с помощью adobe-indesign 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 powershell , выполнив следующую команду:
[guid]::Newguid()
В следующем Adobe ExtendScript (win-generate-uuid.jsx
) показано, как можно сгенерировать UUID с помощью вышеупомянутой команды PowerShell.
Примечание : Для этого решения требуется:
- Windows PowerShell для установки.
- Windows разрешено запускать vbscript .
обоюдного генерировать-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);
Пояснение:
Функция generateUUID
в win-generate-uuid.jsx
использует метод InDesign doScript()
для запуска VBScript.
VBScript, который выполняется, по сути, запускает вышеупомянутую команду PowerShell (хотя и слегка измененную версию), используя команду Run()
.
Примечание: Необходимо использовать VBScript для "shell out" команды PowerShell, поскольку InDesign, работающая в Windows, позволяет выполнять только VBScript или JavaScript с помощью метода doScript
.
Результат команды PowerShell (т.е. сгенерированный UUID) передается по каналу (|
) в буфер обмена.
Впоследствии;
- UUID извлекается из буфера обмена.
- Все переносы (
-
) в сгенерированном UUID удаляются, прежде чем, наконец, return
передать его сценарию .jsx
.
Для дальнейшего объяснения причин, по которым 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
, которая по существу выполняет следующее:
Создает новый документ InDesign (.indd
) и сохраняет его во временной папке ОС, а затем закрывает его. Эта задача выполняется в фоновом режиме, поэтому пользователь не будет знать, что фактический документ был создан.
Примечание Временный каталог по умолчанию для ОС определяется через Folder.temp
. Чтобы лучше понять, где находится временная папка для каждой операционной системы, вы можете временно добавить следующую строку кода в ваш скрипт и записать свой путь в консоль ExtenScript:
$.writeln(Folder.temp);
Далее мы извлекаем DocumentID
из вновь созданного временного файла .indd
, используя функции API сценариев XMP - с которым вы должны быть знакомы из моих ответов на ваши предыдущие вопросы; здесь , здесь и здесь .
- Затем мы удаляем временный
.indd
файл с именем __temp__.indd
. Наконец, префикс xmp.did:
по умолчанию из извлеченного documentID
удаляется.
Примечание: Префикс xmp.did:
по умолчанию удаляется в телефункция generateUUID
затем восстановлена - что может показаться немного странным!Я сделал это намеренно, чтобы generateUUID
оставался более пригодным для повторного использования.Например;вы можете использовать его для генерации InstanceID
и т. д., в этом случае вы, вероятно, захотите добавить префикс UUID к xmp.iid:
.