如何在WinSCP命令中使用环境变量值的字符串处理?

时间:2014-09-16 22:17:36

标签: scripting command environment-variables winscp

我想使用WinSCP命令行管理(上传\下载\删除)FTP服务器上的文件。

它说我可以使用环境变量!我有一些文本文件,其名称中包含日期。

我刚创建了我想要的变量:

Test_%DATE:~10,4%%DATE:~4,2%%DATE:~7,2%.txt 

并使用Windows echo命令对其进行测试。它变为Test_20140916.txt,这正是我现在拥有的。

但是当我尝试在WinSCP中上传该文件时,我收到此错误:

winscp> put D:\FTP\Test_%DATE:~10,4%%DATE:~4,2%%DATE:~7,2%.txt

File or folder 'D:\FTP\Test_%DATE:~10,4%%DATE:~4,2%%DATE:~7,2%.txt' does not exist.
System Error.  Code: 123.
The filename, directory name, or volume label syntax is incorrect
(A)bort, (R)etry, (S)kip, Ski(p) all:

知道如何解决此问题吗?

1 个答案:

答案 0 :(得分:0)

WinSCP本身支持timestamp formatting

put D:\FTP\Test_%TIMESTAMP#yyyymmdd%

解释为什么你的语法不起作用:虽然WinSCP支持脚本命令中的环境变量,但它只支持基本语法%NAME%,如下所述:
https://winscp.net/eng/docs/scripting#syntax

要实现,您需要什么,您必须将值解析为另一个变量并在WinSCP命令中引用它:

set STAMP=%DATE:~10,4%%DATE:~4,2%%DATE:~7,2%
winscp.com /script=script.txt

其中script.txt可以使用%STAMP%

put D:\FTP\Test_%STAMP%

另请注意,%DATE%的值是特定于语言环境的,因此请确保在要使用它的同一语言环境中测试代码。或者甚至更好,使用独立于区域设置的wmic os get LocalDateTime

for /F "usebackq tokens=1,2 delims==" %%i in (`wmic os get LocalDateTime /VALUE 2^>NUL`) do if '.%%i.'=='.LocalDateTime.' set LDT=%%j
set STAMP=%LDT:~0,4%%LDT:~4,2%%LDT:~6,2%