使用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,可能是由于末尾的空格。