我正在编写一个Perl脚本,使用SSH sftpg3.exe进行安全的文件传输
但我遇到访问源文件的问题。 该脚本能够从目录
运行时从C:\ xx \ t.txt中选择文件未显示错误C:\ Program不是有效命令。
my $sftpPath="C:\\Program Files\\client";
my $srcPath="C:\\xx\\test.txt";
my $trgCommand=$sftpPath." -D $srcPath user@host:/tmp/";
my $result=system("$trgCommand");
从C:\目录运行此脚本时,它运行时没有错误,但我无法在目标服务器中看到该文件。
你能帮我解决一下这个文件路径问题吗? 我想从O:\运行它,它将从C:\驱动器中选择目标文件和sftpg3.exe并成功执行文件传输(在ASCII模式下)。
答案 0 :(得分:1)
您可能在第三行插入了@host
,因为您使用的是双引号(""
)。您是否已启用use strict
和use warnings
?路径中的空格()可能也存在问题。
use strict;
use warnings;
use feature 'say';
my $sftp_path = q{"C:\Program Files\Client\sftpg3.exe"};
my $src_path = 'C:\xx\test.txt';
my $result = system( $sftp_path, '-D', $src_path, 'user@host:/tmp/' );
say $result;
让我们来看看我做了什么。
C:\Program Files\foo
的路径时,如果路径中有空格,它通常会用双引号将它们包装起来。所以我们使用q
operator,它相当于单引号,并在里面加上双引号。这也为我们带来了好处,我们没有必要逃避反斜杠\
。另请参阅quote-like operators in perlop。system
允许您将所有参数传递给您想要作为自身参数运行的程序,并将处理引用"user@host:"
中的双引号会尝试将@host
扩展为数组。这不起作用,因为它没有定义。所以有一个警告,你可能没有看到,因为你没有use strict
和use warnings
。而不是双引号,请使用单引号。$sftp_path
而不是$sftpPath
,因为Perl中有一个约定使用下划线而不使用大写字母。我们喜欢骆驼,但不是我们的变量名。 :)