SAS ExportPackage命令超过8191个字符

时间:2015-06-02 09:41:31

标签: batch-file sas

我们使用ExportPackage命令行实用程序(记录为here),为导出元数据项目提供了自动化流程。

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

我们最近在导出多个对象(大约60个)时发现了一种奇怪的行为,我们认为这是由批处理命令的windows line length limitation引起的。

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

有兴趣知道:

  • 可以以未达到8191限制的方式执行ExportPackage命令吗?
  • 或者,可以以某种方式将ExportPackage命令拆分为多行吗?
  • 或者是否有某种方法可以将文件传递给-objects参数,而不是空格分隔的值?
  • 或者是否可以附加(而不是替换).spk文件?

2 个答案:

答案 0 :(得分:1)

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

您可以使用#include <cmath> int MyFunction(int number) { int numDigits = static_cast<int>(std::log10(number)) + 1; std::vector<int> myarr(numDigits); } 个字符在批处理文件中的多行上拆分命令,但重新组合后,这仍然无法绕过整个8191字符限制。

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

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

免责声明:我从未真正使用过相关的导出工具。

答案 1 :(得分:0)

我通过在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点的引号之间插入空格,例如:

"object1"                                 "object2"

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

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

"object1                                   "  "object2"

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