Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
If statement WinSCP命令中的批处理文件IF语句语法_If Statement_Batch File_Syntax_Winscp - Fatal编程技术网

If statement WinSCP命令中的批处理文件IF语句语法

If statement WinSCP命令中的批处理文件IF语句语法,if-statement,batch-file,syntax,winscp,If Statement,Batch File,Syntax,Winscp,我正在尝试更新使用WinSCP下载文件的批处理文件。但我不熟悉语法。在以下代码中,IF语句无法识别。 第一个问题,IF语句的正确语法是什么?我尝试了引号字符的几种排列组合,但在本例中已删除它们。 第二个问题,某些行末尾的^的目的是什么? 第三个问题,在第一行之后的行中缩进的目的是什么 F:\Tools\WinSCP\WinSCP /command="option batch on" ^ "option confirm off" ^ "open W

我正在尝试更新使用WinSCP下载文件的批处理文件。但我不熟悉语法。在以下代码中,
IF
语句无法识别。
第一个问题,
IF
语句的正确语法是什么?我尝试了引号字符的几种排列组合,但在本例中已删除它们。 第二个问题,某些行末尾的
^
的目的是什么? 第三个问题,在第一行之后的行中缩进的目的是什么

F:\Tools\WinSCP\WinSCP /command="option batch on" ^ "option confirm off" ^ "open WinSCP-ProfileName" ^ 
 "lcd F:\Data\TargetDirectory" ^
 "get ""*_SourceFileName.txt"" %TargetFileName%" ^
 IF %computername%==xxx GOTO LabelElse ^
 "echo do something here" ^
 :LabelElse ^
 "exit" /log=F:\Logs\LogFileName.log

谢谢

这似乎是一个模板,您可以根据需要进行调整

if
语句的语法可以说是正确的,尽管在
%computername%
有空格或没有值的情况下,最好的做法是如果“%computername%”==“xxx”转到LabelElse,它看起来像
xxx
位是一台计算机的名称,您不希望在这里执行
echo操作
位,例如一些后期处理或其他操作

^
是批处理中的转义字符,在行尾,它充当行连续字符。我怀疑
“option confirm off”^
“open WinSCP ProfileName”^
也应该在它们自己的行上。事实上,有一个标签作为行延续的一部分(
:LabelElse
)令我惊讶,因为标签必须在自己的行上才能工作。这是一个传递给WinSCP的命令,这一事实可能会使我的担忧变得无关紧要,但您得到一个错误的事实表明,整个代码都是错误的。我通常会为WinSCP位编写一个单独的脚本,并将其作为参数传递


缩进与以下事实相关:
^
是一个行延续字符,旨在证明下面所有行都与第一行相关。

这似乎是一个模板,您可以根据需要进行调整

if
语句的语法可以说是正确的,尽管在
%computername%
有空格或没有值的情况下,最好的做法是如果“%computername%”==“xxx”转到LabelElse
,它看起来像
xxx
位是一台计算机的名称,您不希望在这里执行
echo操作
位,例如一些后期处理或其他操作

^
是批处理中的转义字符,在行尾,它充当行连续字符。我怀疑
“option confirm off”^
“open WinSCP ProfileName”^
也应该在它们自己的行上。事实上,有一个标签作为行延续的一部分(
:LabelElse
)令我惊讶,因为标签必须在自己的行上才能工作。这是一个传递给WinSCP的命令,这一事实可能会使我的担忧变得无关紧要,但您得到一个错误的事实表明,整个代码都是错误的。我通常会为WinSCP位编写一个单独的脚本,并将其作为参数传递


缩进与以下事实相关:
^
是一个行连续字符,用于证明下面所有行都与第一行相关。

如果我错了,请纠正我

使用的常数

  • %错误级别%-
  • %随机%-生成一个随机值
  • if语句的语法:

    如果有多个条件

    if %errorlevel% == 1 if %random% == 45398 goto main
    
    main:
    echo hello
    

    在上面的代码中,这两条语句都为true,然后代码跳转到Label main。

    如果我错了,请纠正我

    使用的常数

  • %错误级别%-
  • %随机%-生成一个随机值
  • if语句的语法:

    如果有多个条件

    if %errorlevel% == 1 if %random% == 45398 goto main
    
    main:
    echo hello
    
    在上面的代码中,这两条语句都为true,然后代码跳转到Label main。

    您的整个“批处理文件”实际上是一个WinSCP命令行。它只是

    不能在其他命令(本例中为WinSCP命令行)中使用批处理命令(如
    if

    如果需要有条件地修改传递给WinSCP的命令,您可以:

    • 必须根据您的条件预先将命令行组装为变量,然后立即将其传递给WinSCP

    • 或者,更简单的方法是组装一个WinSCP脚本文件

      set SCRIPT=%TEMP%\winscp.txt
      
      (
         echo option batch on
         echo option confirm off
         echo open WinSCP-ProfileName
         echo lcd F:\Data\TargetDirectory
         echo get "*_SourceFileName.txt" %TargetFileName%
         IF not %computername%==xxx (
           echo some computer-specific commands here
         )
         echo exit
      ) > %SCRIPT%
      
      F:\Tools\WinSCP\WinSCP /script=%SCRIPT%  /log=F:\Logs\LogFileName.log
      
    您的整个“批处理文件”实际上是一个WinSCP命令行。它只是

    不能在其他命令(本例中为WinSCP命令行)中使用批处理命令(如
    if

    如果需要有条件地修改传递给WinSCP的命令,您可以:

    • 必须根据您的条件预先将命令行组装为变量,然后立即将其传递给WinSCP

    • 或者,更简单的方法是组装一个WinSCP脚本文件

      set SCRIPT=%TEMP%\winscp.txt
      
      (
         echo option batch on
         echo option confirm off
         echo open WinSCP-ProfileName
         echo lcd F:\Data\TargetDirectory
         echo get "*_SourceFileName.txt" %TargetFileName%
         IF not %computername%==xxx (
           echo some computer-specific commands here
         )
         echo exit
      ) > %SCRIPT%
      
      F:\Tools\WinSCP\WinSCP /script=%SCRIPT%  /log=F:\Logs\LogFileName.log
      

      • 多亏了这里的建议,我才让它发挥作用!我真正想做的是,在Dev或UAT中执行时不要从sFTP站点删除该文件。很好

        IF %computername%==DevServer GOTO LabelElse
        IF %computername%==UatServer GOTO LabelElse
          set "DisplayText=WinSCP command - INCLUDES DELETE from sFTP site - for PRODUCTION"
          set "DeleteOption=-delete"
          GOTO LabelEndif
        :LabelElse
          set "DisplayText=WinSCP command - DOES NOT DELETE from sFTP site - for *NON-PROD*"
          set "DeleteOption="
        :LabelEndif
        
        rem other stuff here
        
        ECHO %DisplayText%
        F:\Tools\WinSCP\WinSCP /command="option batch on" ^ "option confirm off" ^ "open WinSCP-ProfileName" ^ "lcd F:\Data\TargetDirectory" ^
        "get %DeleteOption% ""*_SourceFileName.txt"" %TargetFileName%" ^
        "exit" /log=F:\Logs\LogFileName.log
        

        多亏了这里的建议,我才得以成功!我真正想做的是,在Dev或UAT中执行时不要从sFTP站点删除该文件。很好

        IF %computername%==DevServer GOTO LabelElse
        IF %computername%==UatServer GOTO LabelElse
          set "DisplayText=WinSCP command - INCLUDES DELETE from sFTP site - for PRODUCTION"
          set "DeleteOption=-delete"
          GOTO LabelEndif
        :LabelElse
          set "DisplayText=WinSCP command - DOES NOT DELETE from sFTP site - for *NON-PROD*"
          set "DeleteOption="
        :LabelEndif
        
        rem other stuff here
        
        ECHO %DisplayText%
        F:\Tools\WinSCP\WinSCP /command="option batch on" ^ "option confirm off" ^ "open WinSCP-ProfileName" ^ "lcd F:\Data\TargetDirectory" ^
        "get %DeleteOption% ""*_SourceFileName.txt"" %TargetFileName%" ^
        "exit" /log=F:\Logs\LogFileName.log
        

        你的说法是正确的,但这与问题有什么关系?如果你的意思是这样的话,
        ==
        周围的空格是可选的。你的陈述是正确的,但这与问题有什么关系?
        ==
        周围的空格是可选的,如果这是您想要的。很好。请注意,
        ^
        在批处理文件中用于转义换行符。因此,它不应该在命令之间,在命令之间不打断一条线。类似于
        “选项批处理打开”
        “选项确认关闭”
        (尽管这些tw