perl FTP到z/OS,防止在目标文件名前面加上用户ID

perl FTP到z/OS,防止在目标文件名前面加上用户ID,perl,ftp,zos,Perl,Ftp,Zos,我正在尝试编写一个perl脚本(如下所示),以自动将源文件从Windows上载到z/OS(也称为MVS或OS/390)。put()方法似乎在z/OS上的远程数据集(文件)名称前面加上我登录时使用的用户名(“JCARTER”)。我要上传到的远程数据集名称是“FSI.V121P01.INSTALL”,它是一个分区数据集(PDS)。使用“JCARTER”作为目标数据集名称的前缀会导致找不到数据集,并且put()会失败。我尝试了引用目标文件名的不同方法,但我的userid仍然在文件名前面。我还尝试使用c

我正在尝试编写一个perl脚本(如下所示),以自动将源文件从Windows上载到z/OS(也称为MVS或OS/390)。put()方法似乎在z/OS上的远程数据集(文件)名称前面加上我登录时使用的用户名(“JCARTER”)。我要上传到的远程数据集名称是“FSI.V121P01.INSTALL”,它是一个分区数据集(PDS)。使用“JCARTER”作为目标数据集名称的前缀会导致找不到数据集,并且put()会失败。我尝试了引用目标文件名的不同方法,但我的userid仍然在文件名前面。我还尝试使用cwd()来设置cwd,使用quote('SITE','quoteOverride')和quote('SITE','DATASETMODE'),但仍然没有成功

以下是脚本:

use strict;
use Net::FTP;

my $HostIP="xxx.xxx.xxx.xxx";
my $ftp;

$ftp = Net::FTP -> new ($HostIP) or die "Cannot connect to zOS: $@";
$ftp->login("userid","pw") or die "Cannot login.", $ftp->message;
$ftp->ascii();

#$ftp->cwd();
#$ftp->quot('SITE', 'QUO');
#$ftp->quot('SITE', 'DATAS');
print $ftp->message;
$ftp->pwd();
print $ftp->message;
$ftp->put('J:\REL122\RPS100\A2WBLIB\C\a2wversn.c', 'FSI.V121P01.INSTALL(A2WVERSN)');
print $ftp->message;
$ftp->quit;
运行上述程序会产生以下消息:

表示类型为Ascii非打印 “JCARTER.”是工作目录。 JCARTER.FSI.V121P01.INSTALL(A2WVERSN)请求不存在的分区数据 T使用MKD命令创建它

当我尝试添加cwd(“”)以删除当前工作目录时,我得到:

表示类型为Ascii非打印 “JCARTER.”是工作目录。 “/”是HFS工作目录。 存储数据集/FSI.V121P01.INSTALL(A2WVSN) 打开/FSI.V121P01.INSTALL(A2WVERSN)失败


看来我已经很接近了。有什么建议吗?谢谢-John

听起来,当您通过FTP连接时,它将您放入的数据集按照您的用户名命名为“JCARTER”

您是否尝试过cdup()使您脱离名为dataset的JCARTER?然后,您可以将cwd()插入FSI.V121P01.INSTALL PDS


如果这不起作用,您可能只需要建立连接,运行dir()并查看Net::FTP为您返回的内容。这可能会使事情在逻辑上更易于导航。

Nick-是的,添加cdup()成功了!cdup()似乎删除了启动FTP会话时放入的“JCARTER.”工作目录。我在使用cdup()后看到的FTP消息让我相信我也可以使用cwd(“”),所以我尝试了一下,也成功了。你为我节省了很多时间。谢谢。z/OS PDS与目录无关。z/OS中有一些语法糖使得非HFS数据集(如PDS)看起来像是由目录组成的,但这些只是数据集名称限定符。如果可以在数据集名称周围加上撇号,这也可能解决您的问题。我相信非HFS文件系统早于目录(20世纪60年代末)。这个解决方案没有问题,只是指出了一些问题。继续。@cschneid-是的,我刚刚试着用双引号将目标文件名括在单引号中,这同样有效$ftp->put('J:\REL122\RPS100\A2WBLIB\C\a2wversn.C','FSI.V121P01.INSTALL(a2wversn)');我应该早点试试。谢谢你的补充信息。很有趣,谢谢你的澄清。希望我的编辑使用适当的术语。实际上,我以前没有使用过z/OS PDS—我只知道有时Net::FTP无法将您连接到最直观的位置,而cdup()或类似的导航调用可以减轻很多麻烦。