简体   繁体   English

从FTP服务器获取文件并将其复制到UNC目录

[英]Get file from FTP server and copy it to UNC directory

I am trying to copy a CSV file from an FTP server to a UNC file path. 我试图将CSV文件从FTP服务器复制到UNC文件路径。 I had it working from FTP to a local path, but it would be better for my project to have it copy to a UNC path. 我有它从FTP到本地路径,但我的项目将其复制到UNC路径会更好。 This must all be achieved in batch and FTP commands. 这必须在批处理和FTP命令中实现。

This is my code so far: 到目前为止这是我的代码:

for /f "delims=" %%x in (config.bat) do (set "%%x")
echo Start[%time%] >> "%primefolder%\TimeRun.log"
REM --------------------------------------------------------------------------------------------
REM  Import .csv from the ftp server - csv imported to local directory
REM         Ftpcmd.txt connects to the ftp server and copies the .csv file to a local directory
REM --------------------------------------------------------------------------------------------
echo open %FTPIP%> %primefolder%\ftpcmd.txt
echo %FTPUsername%>> %primefolder%\ftpcmd.txt
echo %FTPPassword%>> %primefolder%\ftpcmd.txt
echo cd %FTPPrimary%>> %primefolder%\ftpcmd.txt
echo binary>> %primefolder%\ftpcmd.txt
echo lcd /D "%offload%" >> %primefolder%\ftpcmd.txt
echo mget %Filename%>> %primefolder%\ftpcmd.txt
echo disconnect>> %primefolder%\ftpcmd.txt
echo quit>> %primefolder%\ftpcmd.txt
REM -----------------------------------------------------------------------------------------------------------------------------
REM  Call and execute the FTP command text document (ftpcmd.txt)
REM         This Code calls the file which establishes a connection and then copies the file to a local directory   
REM         Dynamic FTP command file is created and populated.
REM -----------------------------------------------------------------------------------------------------------------------------
ftp -i -s:"%primefolder%\ftpcmd.txt" >"%primefolder%\logs\ftpinport.log" 2>>"%primefolder%\logs\ftperr.log"
echo[%date% - %time%] >> "%primefolder%\logs\ftpinport.log" 
ftp -i -d -s:%primefolder%\ftpcmd.txt
for /f "tokens=*" %%a in (%primefolder%\logs\ftperr.log) do (echo [%date% - %time%]  [Error Level: 1][Issue Location:FTP][Error:%%a] >> "%primefolder%\logs\error.log")

This is the config file: 这是配置文件:

primefolder=C:\scripts
FTPIP=111.11.1.1
FTPUsername=User
FTPPassword=test
Filename=User.csv
FTPPrimary=\CSV\
FTPArchive=\CSV\Archive
offload=\\test.org\test_this\Implementation\New Projects\New\Interface

Thank you for all your help ahead of time! 提前感谢您的帮助!


After changing mget to get as suggested in an answer by @Martin Prikryl , I am getting this error: 更改mgetget @Martin Prikryl的答案中的建议后,我收到此错误:

R:I/O Error R:I / O错误

This is the ftp output: 这是ftp输出:

ftp> open 111.11.1.1
Connected to 111.11.1.1.
220 Welcome to Code-Crafters Ability FTP Server.
User (111.11.1.1:(none)): 
331 Please send PASS now.

230-Welcome "User".
230-There are currently 1 of 100 users logged onto this server.
230-There are currently 1 users logged onto this account.
230-You have unlimited KB of account allocation left.
230-You have 0 transfer credits remaining.
230-You lose 0 credits per KB downloaded.
230-You lose 0 credits per KB uploaded.
230 You are currently in directory "/".
ftp> cd \CSV\
250 "/CSV" is current directory.
ftp> binary
200 Type set to 'I' (IMAGE).
ftp> get User.csv \\test.org\test_this\Implementation\New Projects\New\Interface\User.csv 
200 PORT command successful.
150 Data connection established, beginning transfer.
226 Transfer complete.
ftp: 1277532 bytes received in 2.64Seconds 483.91Kbytes/sec.
ftp> disconnect
221 Thanks for visiting.
ftp> quit

When redirecting the error and output of ftp to one file I get this as the output: 将错误和输出ftp重定向到一个文件时,我将其作为输出:

 ftp> open 111.11.1.1
    Connected to 111.11.1.1
    220 Welcome to Code-Crafters Ability FTP Server.
    User (111.11.1.1:(none)): 
    331 Please send PASS now.

    230-Welcome "User".
    230-There are currently 2 of 100 users logged onto this server.
    230-There are currently 1 users logged onto this account.
    230-You have unlimited KB of account allocation left.
    230-You have 0 transfer credits remaining.
    230-You lose 0 credits per KB downloaded.
    230-You lose 0 credits per KB uploaded.
    230 You are currently in directory "/".
    ftp> cd \CSV\
    250 "/CSV" is current directory.
    ftp> binary
    200 Type set to 'I' (IMAGE).
    ftp> get User.csv \\test.org\test_this\Implementation\New Projects\New\Interface\User.csv  
    200 PORT command successful.
    150 Data connection established, beginning transfer.
    > R:I/O Error
    226 Transfer complete.
    ftp: 1277532 bytes received in 2.84Seconds 449.20Kbytes/sec.
    ftp> disconnect
    221 Thanks for visiting.
    ftp> quit

UNC path cannot be a working directory in Windows. UNC路径不能是Windows中的工作目录。

So lcd \\\\example.com\\share won't work. 所以lcd \\\\example.com\\share将无效。

The mget command does not allow your to specify a target path. mget命令不允许您指定目标路径。

But you do not seem to need the mget , as you are not using a wildcard, but downloading a specific file. 但是您似乎不需要mget ,因为您没有使用通配符,而是下载特定文件。

So you can use the get command instead, which allows you to specify a target path. 因此,您可以使用get命令 ,它允许您指定目标路径。

echo get %Filename% "%offload%\%Filename%" >> %primefolder%\ftpcmd.txt

Also note that as your %offload% path contains a space ( New Projects ) you need to enclose the path to double-quotes. 另请注意,由于%offload% path包含空格( New Projects ),因此需要将路径括在双引号中。

And finally remove the 最后删除

echo lcd /D "%offload%" >> %primefolder%\ftpcmd.txt

Side note: There's no /D switch to the FTP lcd command (there are no switches in the Windows ftp.exe whatsoever). 附注:没有/D切换到FTP lcd命令 (Windows ftp.exe中没有任何开关)。


Had you need to use the wildcard, you would have to use a different FTP client. 如果您需要使用通配符,则必须使用其他FTP客户端。

For example with WinSCP scripting you can use: 例如,使用WinSCP脚本,您可以使用:

winscp.com /log=winscp.log /command ^
    "open ftp://%FTPUsername%:%FTPPassword%@%FTPIP%/" ^
    "cd %FTPPrimary%" ^
    "get %Filename% %offload%\" ^
    "exit" > "%primefolder%\logs\ftpinport.log" 

Note that the WinSCP get command supports wildcards and allows you to specify target path at the same time. 请注意, WinSCP get命令支持通配符,并允许您同时指定目标路径。 WinSCP also defaults to binary transfer mode. WinSCP也默认为二进制传输模式。

References: 参考文献:

(I'm the author of WinSCP) (我是WinSCP的作者)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM