微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决WinSCP命令中的批处理文件IF语句语法

我正在尝试更新使用 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

谢谢!

解决方法

您的整个“批处理文件”实际上是一个 WinSCP 命令行。它只是broken into multiple physical lines using the ^ and the indentation

您不能在其他命令(本例中为 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
    
,

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

if 语句的语法可以说是正确的,但最佳做法是让它看起来像 if "%computername%"=="xxx" goto LabelElse,以防 %computername% 有空格或不知何故没有值。 xxx 位是您不想在其上运行 echo do something here 位的计算机的名称,例如某些后处理或其他东西。

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

缩进与 ^ 是行继续符这一事实有关,旨在证明以下所有行都与第一行相关。

,

感谢这里的建议,我让它工作了!我真正想做的是在 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
,

如果我错了,请纠正我。

使用的常量

  1. %errorlevel% - What is this?
  2. %random% - 生成一个随机值。

if 语句的语法:

if %errorlevel% == 0 exit

如果有多个条件。

if %errorlevel% == 1 if %random% == 45398 goto main

main:
echo hello

上面代码中的两个语句都为真则代码跳转到Label main。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。