我制作了一个CL程序来简化更改所有者,USRPRF和对象的权限。它利用GRTOBJAUT等进行更改。这是参数定义:
grtobjaut obj(&libobj) objtype(*all) user(&user1) +
aut(&auth1)
这就是我称之为GRTOBJAUT的方式:
&libobj
但是,只有grtobjaut obj('MYLIB/TEST')
的前10个字符实际传递给GRTOBJAUT。我已在调试器中验证,尽管&libobj
包含完整字符串,但传递例如MYLIB / TEST1234会导致{{1}}。根据{{3}},这应该是GRTOBJAUT命令的正确语法,因此允许超过10个字符的长路径。实际情况并非如此吗?交互式GRTOBJAUT和CL GRTOBJAUT之间有区别吗?我如何使这项工作?
该程序是针对v6.1编译的,并在支持v7.1的环境中运行。
编辑:同样的问题适用于CHGOBJOWN。
答案 0 :(得分:7)
您不能在单个参数中同时传递库名和对象名。 GRTOBJAUT OBJ()参数有两部分,而不仅仅是一部分。您只定义一个部分,并声明它长度为21个字符。但事实并非如此。它是两部分,每个部分长十个字符。
通常,您应该以这种方式更改CL:
pgm parm(&lib &obj &type &owner &usrprfown &user1 &auth1 +
&user2 &auth2 &user3 &auth3)
...
dcl var(&lib) type(*char) len(10)
dcl var(&obj) type(*char) len(10)
库和对象名称作为单独的10个字符名称传递。那么GRTOBJAUT命令就是这样的:
grtobjaut obj(&lib/&obj) objtype(*all) user(&user1) +
aut(&auth1)
请注意,OBJ()参数分别指定了两个部分。
如果您愿意,可以将21个字符的CL parm留在原位。但是,如果这样做,则必须向CL添加代码以解析该parm值并在将它们传递到GRTOBJAUT之前提取库和对象名称。将它们分别传递到CL中更简单。
将它们分开后,当GRTOBJAUT收到它时,您需要确保& lib不为空。如果它作为空值进入你的CL,你需要分配一个特殊的值,如'* LIBL','* CURLIB'或任何合适的值,以便GRTOBJAUT可以处理它。
还有其他选择,但在尝试尝试基本上是“诡计”的事情之前,你应该先学习这个要求。