WinSCP 命令中的批处理文件 IF 语句语法
Posted
技术标签:
【中文标题】WinSCP 命令中的批处理文件 IF 语句语法【英文标题】:Batch file IF statement syntax in WinSCP commands 【发布时间】:2021-06-14 08:52:07 【问题描述】:我正在尝试更新使用 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
谢谢!
【问题讨论】:
【参考方案1】:您的整个“批处理文件”实际上是一个 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
【讨论】:
【参考方案2】:这似乎是一个模板,您可以根据自己的需要进行调整。
if
语句的语法可以说是正确的,但最好的做法是让它看起来像if "%computername%"=="xxx" goto LabelElse
,以防%computername%
有空格或不知何故没有值。 xxx
位将是您不想在其上运行 echo do something here
位的计算机的名称,例如一些后处理或其他东西。
^
是批量转义字符,在行尾充当续行字符。我怀疑"option confirm off" ^
和"open WinSCP-ProfileName" ^
也应该在他们自己的路线上。有一个标签作为续行的一部分 (:LabelElse
) 让我感到惊讶,因为标签必须在自己的行上才能工作。这是一个传递给 WinSCP 的命令这一事实可能使我的担忧无关紧要,但您收到错误的事实表明整个事情的编码不正确。我通常会为 WinSCP 位编写一个单独的脚本并将其作为参数传递。
缩进与^
是一个续行字符有关,旨在证明以下所有行都与第一行相关。
【讨论】:
【参考方案3】:感谢这里的建议,我得到了它的工作!我真正想做的是在 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
【讨论】:
好。请注意,^
在批处理文件中用于转义换行符。所以它不应该在命令之间,你不换行。就像在"option batch on"
和"option confirm off"
之间一样(尽管这两个命令并不是真正需要的,因为它们是默认的)。【参考方案4】:
如果我错了,请纠正我。
常量使用:
-
%errorlevel% - What is this?
%random% - 生成一个随机值。
if 语句的语法:
if %errorlevel% == 0 exit
如果有多个条件。
if %errorlevel% == 1 if %random% == 45398 goto main
main:
echo hello
在上面的代码中,两个语句都为真则代码跳转到Label main。
【讨论】:
您的说法是正确的,但这与问题有什么关系?==
周围的空格是可选的,如果这就是你想要的。以上是关于WinSCP 命令中的批处理文件 IF 语句语法的主要内容,如果未能解决你的问题,请参考以下文章