如何在perl中获取最后执行的命令的值
我正在尝试执行一个简单的草莓perl脚本进行文件复制,以从最后执行的命令中获取代码。但在所有情况下,我都获得了0/成功 来自test.pl脚本的代码如何在perl中获取最后执行的命令的值,perl,error-handling,copy,file-copying,strawberry-perl,Perl,Error Handling,Copy,File Copying,Strawberry Perl,我正在尝试执行一个简单的草莓perl脚本进行文件复制,以从最后执行的命令中获取代码。但在所有情况下,我都获得了0/成功 来自test.pl脚本的代码 use File::Copy; use strict; use warnings; my $source_file = "D:\\abc\\def\\in\\test\\test1.csv"; my $target_file = "D:\\abc\\def\\in\\test\\test2.csv"; if ( copy( $source_
use File::Copy;
use strict;
use warnings;
my $source_file = "D:\\abc\\def\\in\\test\\test1.csv";
my $target_file = "D:\\abc\\def\\in\\test\\test2.csv";
if ( copy( $source_file, $target_file ) == 0 ) {
print "success";
}
else { print "fail"; }
由于我在\\test\\test1.csv中使用的路径D:\\abc\\def\\in\\test\\test1.csv
在计算机上不存在,因此我预计会失败,但无论我提供什么,我都会成功
在执行和输出之后:
D:\pet\common\bin\backup>perl test.pl
success
D:\pet\common\bin\backup>perl test.pl
成功
如果查看
perldoc File::Copy
,您将看到以下内容:
RETURN
All functions return 1 on success, 0 on failure. $! will be set if an
error was encountered.
因此,您的代码应该公开$中的内容代码>如果出现错误:
if ( copy($source_file, $target_file)) {
print "success\n";
}
else {
warn "fail: $!\n";
}
另外,如File::Copy文档中所述,Copy
在成功时返回1
(真值),因此我在成功测试中删除了==0
。在Perl中,if(COND){…}
语句中的任何真值都可以;您不需要显式地测试1
关于路径:/
字符可以用作路径分隔符,即使您使用的是Windows,但在某些情况下,您可能会将路径发送到外部程序。此功能允许您相对可移植地编写代码,将路径表示为foo/bar/baz
,并且它在Windows上的工作方式与在*nix操作系统下的工作方式类似。使用正斜杠作为分隔符可以避免转义路径中的每个反斜杠:foo\\bar\\baz
如果查看perldoc File::Copy
,您将看到以下内容:
RETURN
All functions return 1 on success, 0 on failure. $! will be set if an
error was encountered.
因此,您的代码应该公开$中的内容代码>如果出现错误:
if ( copy($source_file, $target_file)) {
print "success\n";
}
else {
warn "fail: $!\n";
}
另外,如File::Copy文档中所述,Copy
在成功时返回1
(真值),因此我在成功测试中删除了==0
。在Perl中,if(COND){…}
语句中的任何真值都可以;您不需要显式地测试1
关于路径:/
字符可以用作路径分隔符,即使您使用的是Windows,但在某些情况下,您可能会将路径发送到外部程序。此功能允许您相对可移植地编写代码,将路径表示为foo/bar/baz
,并且它在Windows上的工作方式与在*nix操作系统下的工作方式类似。使用正斜杠作为分隔符可以避免转义路径中的每个反斜杠:foo\\bar\\baz
这是我的第一篇文章,因此请原谅对文章的格式化copy
失败时返回false/zero(这与system
)非常感谢David O和ikegami!它解决了这个问题。这是我的第一篇博文,请原谅博文的格式设置复制
失败时返回false/zero(这不像系统
),非常感谢David O和ikegami!它解决了这个问题。大多数外部程序也会接受/
,因为/
实际上是由Windows本身完全支持的。(Perl不会将/
转换为\
;它只是将带有/
的路径传递给操作系统。)问题通常来自/
被视为命令行切换的开始,这一问题通常可以通过使用引号来规避。(dir c:/temp
bad;dir“c:/temp”
ok)正确:这在perldoc perlport
at中有记录,尽管您的示例很好,缺少文档。@DavidO实际上我有另一个脚本,我正在尝试使用草莓perl通过pmcmd命令执行Informatica工作流,但我无法捕获工作流的失败。我正在使用if(qx($pmcmd_command)),其中$pmcmd_命令具有要执行的实际命令。qx/
返回STDOUT,但STDERR会丢失,除非您将其重定向到某个地方,我不知道在Windows中如何执行。如果我是你,我会使用Capture::Tiny模块,它使处理STDOUT、STDERR和退出代码变得简单、可移植。大多数外部程序也会接受/
,因为/
实际上完全受Windows本身的支持。(Perl不会将/
转换为\
;它只是将带有/
的路径传递给操作系统。)问题通常来自/
被视为命令行切换的开始,这一问题通常可以通过使用引号来规避。(dir c:/temp
bad;dir“c:/temp”
ok)正确:这在perldoc perlport
at中有记录,尽管您的示例很好,缺少文档。@DavidO实际上我有另一个脚本,我正在尝试使用草莓perl通过pmcmd命令执行Informatica工作流,但我无法捕获工作流的失败。我正在使用if(qx($pmcmd_command)),其中$pmcmd_命令具有要执行的实际命令。qx/
返回STDOUT,但STDERR会丢失,除非您将其重定向到某个地方,我不知道在Windows中如何执行。如果我是你,我会使用Capture::Tiny模块,它使处理STDOUT、STDERR和退出代码变得简单、可移植。