批处理文件- SAS ExportPackage命令长度超过8191个字符



使用ExportPackage命令行实用工具(在这里有文档说明),我们有一个自动导出元数据项以进行推广的过程。

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

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

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

我很想知道:

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

我怀疑你会喜欢这个问题的答案。您所链接的文档说明,具有相同名称的现有包文件将被覆盖,并且没有提到任何附加方法。

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

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

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

免责声明:我从来没有实际使用过导出工具的问题。

我通过在8191点插入一个虚拟字符来解决这个问题。请注意,这个8191长度限制是"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= pathtomy.log;
  %let profile= -profile "pathtomydummyprofile.swa";
  %let package= -package "pathtomydesired.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,可能是由于末尾的空格。

最新更新