SAS ExportPackage 命令超过 8191 个字符

SAS ExportPackage command exceeds 8191 characters

我们使用 ExportPackage 命令行实用程序(已记录 here)有一个自动导出元数据项以进行推广的过程。

命令被写入 .bat 文件,然后通过文件名管道执行(在 SAS 中)。

我们最近在导出多个对象(大约 60 个)时观察到一个奇怪的行为,我们认为这是由于 windows line length limitation 用于批处理命令。

基本上,一个字符会被删除(意味着不会找到特定对象),但该行的其余部分(在 8191 个字符之后)会成功执行。

有兴趣了解:

我怀疑是否有任何您会喜欢的答案。您链接的文档指出,具有相同名称的现有包文件将被覆盖,并且没有提及任何追加方式。

您可以在批处理文件中使用 ^ 个字符将命令拆分为多行,但是在重新组合各个部分后,这仍然无法解决 8191 个字符的总体限制。

因此,您需要执行以下一项或多项操作:

  • 将您的项目导出到具有不同文件名或不同文件夹的单独包中,例如一次 20 个
  • 在导出之前将您的对象移动到一组有限的文件夹和子文件夹中,并且仅导出顶级文件夹而不是单个对象。看起来您仍然可以使用其他命令行选项来限制导出的对象。
  • 愚蠢的选择:创建一个虚拟对象,它依赖于您要导出的所有对象,在对象列表中仅明确提及该对象,并使用 -includeDep 参数强制导出实用程序导出它的所有依赖项。

免责声明:我从未真正使用过相关的导出实用程序。

我通过在 8191 点插入一个虚拟字符来解决这个问题。请注意,此 8191 长度限制是命令 AFTER "ExportPackage".

中的所有内容

因此,一种解决方案如下:

  /* If the ExportPackage command line is more than 8191 characters, it will 
     fail due to a windows line length limitation. To avoid this, add a
     hash character at the 8191 point.
  */   
  %let log= \path\to\my.log;
  %let profile= -profile "\path\to\my\dummy\profile.swa";
  %let package= -package "\path\to\my\desired.spk";

  %let str=&my_list_of_objects; /* previously defined */
  %let breakpoint=%eval(
              8191 - %length(%str(&profile &package -objects))-1);
  %if %length(&str)>=&breakpoint %then %let objects=%substr(
    &str,1,&breakpoint-1)#%substr(&str,&breakpoint,%length(&str)-&breakpoint+1);
  %else %let objects=&str;

然后可以按照以下行执行命令:

ExportPackage &profile &package &objects -subprop -includeEmptyFolders -log &log

什么不起作用:

在8191点引号之间插入空格,eg:

"object1"                                 "object2"

多余的空格被忽略,仍然从第二个对象中删除了一个字符。

在文字中插入空格,例如:

"object1                                   "  "object2"

未找到对象 1,可能是由于尾随空格。