perl 使用scp命令将文件传输到sftp的SSMS代理作业将循环,无法完成

sgtfey8w  于 2022-11-15  发布在  Perl
关注(0)|答案(1)|浏览(220)

我已经尝试了不同的方法,使SSM的工作与SCP命令与perl脚本.但工作是进入循环没有出有结果. PS:直接从命令提示符运行脚本可以正常工作。
perl脚本中使用的命令:-

$Command = "scp -i D:\File1\RS2\DataFeed\Code\PrivateKey.ppk -s $InternalFile admin@sftp.world.com:$VendorName/$DestFileName";

perl中使用系统命令

system($command);

当直接从windows cmd运行命令时,它会正确地将文件放置到SFTP。但当从ssms代理作业运行此Perl脚本时,它似乎不工作,作业继续运行,没有任何结果。任何可能导致实际错误的原因都将非常感谢
详细步骤:
SSMS中的作业:

步骤:

DataFeed.cmd

%_Debug% echo off

cd /d %0\.. 
pushd .
setlocal

rem -----------------------------------------------------------------
rem Localize environment
rem -----------------------------------------------------------------

if exist DataFeed_Environment.cmd (
    call DataFeed_Environment.cmd
) else (
    echo DataFeed_Environment.cmd not found!!!
    echo
    goto CmdUsage
)


rem -----------------------------------------------------------------
rem Run perl package
rem -----------------------------------------------------------------

C:\Perl\bin\perl.exe DataFeedProd1.pl
if %ERRORLEVEL% NEQ 0 goto ErrorExit

goto Exit

rem -----------------------------------------------------
rem Command Usage
rem -----------------------------------------------------
:CmdUsage
    Echo ---------------------------------------------------------------------
    echo.
    echo DataFeed.cmd
    echo  Wraps the call to DataFeed.pl,
    echo  mails log upon errors.
    echo.
    echo Usage:
    echo DataFeed.cmd
    echo.
    echo ----------------------------------
rem endlocal
rem popd
rem exit 1

rem -----------------------------------------------------------------
rem Error exit
rem -----------------------------------------------------------------
:ErrorExit
echo DataFeedProd1.pl failed !!!
echo 
rem endlocal
rem popd
rem exit  1

rem -----------------------------------------------------------------
rem Exit
rem -----------------------------------------------------------------
rem endlocal
rem popd
:Exit

rem exit  0
sub CopyDataFeedFileToSftp{

   my ($DataFeedFileInternal, $DataFeedVendorName,$DataFeedFileName) = @_;
   my($DestFileName)=$DataFeedFileName.".zip";
   my($Command);
   my($RetValue) = 1;

   $Command = "C:\\Users\\hprasu\\Downloads\\OpenSSH-Win64\\scp.exe -i D:\\File1\\RS2\\DataFeed\\Code\\PrivateKey.ppk -s $DataFeedFileInternal a_Tne\@nasftp\.egencia.com:$DataFeedVendorName/$DestFileName";
   $RetVal = &CallSystem($Command);
   if ($RetVal == 0) {
      &AppendFileToLog($TempFile);
      &ErrorExit("Unable to copy data feed file using SCP command:\n".$Command);
   }
}

上面的perl方法正在执行System命令

ruyhziif

ruyhziif1#

您应该:

  • 我有perl.exe的完整路径和作业命令中的perl脚本
  • 对Perl的内插字符串中的所有特殊字符进行转义,并
  • 使用scp命令的完整路径,因为操作系统不知道scp.exe的位置(直到它位于$PATH中):
  • 请检查命令和perl脚本中所有文件的文件系统权限。作业应该具有访问这些文件的权限。

所以指挥官应该是

$Command = "full_path\\scp.exe -i D:\\File1\\RS2\\DataFeed\\Code\\PrivateKey.ppk -s $InternalFile admin\@sftp.world.com:$VendorName/$DestFileName";

请阅读:https://www.geeksforgeeks.org/perl-quoted-interpolated-and-escaped-strings/

相关问题