Batch file 从FTP检索文件,根据文件名在服务器上组织
我们有两个由标准普尔计算的自定义索引。标准普尔将8个文件(每个索引4个)上传到我可以访问的FTP服务器文件夹。它们每天晚上都会被上传,第二天早上我就会把它们取回。我希望这是自动化的,因为他们一次只在服务器上维护5天 以下是示例文件名: 20160805_LUKDGUPBatch file 从FTP检索文件,根据文件名在服务器上组织,batch-file,ftp,Batch File,Ftp,我们有两个由标准普尔计算的自定义索引。标准普尔将8个文件(每个索引4个)上传到我可以访问的FTP服务器文件夹。它们每天晚上都会被上传,第二天早上我就会把它们取回。我希望这是自动化的,因为他们一次只在服务器上维护5天 以下是示例文件名: 20160805_LUKDGUP 20160805_LUKDGUP_NCS 20160805_LUKDGUP_NCS_ADJ 20160805_LUKDGUP_NCS_CLS 20160805_LUKSGUP 20160805\u LUKSGUP\u NCS 20
20160805_LUKDGUP_NCS
20160805_LUKDGUP_NCS_ADJ
20160805_LUKDGUP_NCS_CLS
20160805_LUKSGUP
20160805\u LUKSGUP\u NCS
20160805\u LUKSGUP\u NCS\u ADJ
20160805\u LUKSGUP\u NCS\u CLS
我要做的是将它们下载到本地服务器,并根据文件名将它们自动放入文件夹中→ 20160805_LUKDGUP_*文件放入LUKDGUP\20160805\文件夹,LUKSGUP文件也是如此 我尝试过修改其他帖子中的一些批处理文件,但我认为我一直在犯一些小错误,使它们无法工作 编辑20160809-0841: 我一直在尝试修改它以满足我的需要,但未能很好地遵循循环:
setlocal
set "basename=."
PAUSE
for /F "tokens=1 delims=_" %%a in ('dir /B /A-D') do (
set "filename=%%a"
setlocal EnableDelayedExpansion
for /F "delims=" %%c in ("!basename!") do if "!filename:%%c=!" equ "!filename!" (
set "basename=!filename!"
md "!basename!"
)
move "!filename!.%%b" "!basename!"
for /F "delims=" %%c in ("!basename!") do (
endlocal
set "basename=%%c
PAUSE
)
)
当然,这并不涉及FTP自动化,但我想我可以通过Filezilla或其他FTP软件解决这一部分。一旦它出现在我们的服务器上,组织就是这篇文章试图解决的问题。不要试图在批处理文件中破解它 在PowerShell中实现这一点更容易:
$url=”ftp://user:password@ftp.example.com/remote/path/“
$request=[System.Net.WebRequest]::Create($url)
$request.Method=[System.Net.WebRequestMethods+Ftp]::ListDirectory
$response=$request.GetResponse()
$reader=新对象IO.StreamReader$response.GetResponseStream()
$listing=$reader.ReadToEnd()
$reader.Close()
$response.Close()
$files=
($listing-split“`r`n”)|
其中对象{$\类似于“*.*”}
$webclient=新对象System.Net.webclient
foreach($files中的文件)
{
$tokens=$file-split“\ux”
$localPath=(连接路径$tokens[0]$tokens[1])
$localFilePath=(连接路径$localPath$file)
写入主机($file+“=>”+$localFilePath)
if(!(测试路径-路径$localPath))
{
新项-Path$localPath-ItemType目录| Out Null
}
$webclient.DownloadFile(($url+$file),$localFilePath)
}
不要试图在批处理文件中对此进行破解
在PowerShell中实现这一点更容易:
$url=”ftp://user:password@ftp.example.com/remote/path/“
$request=[System.Net.WebRequest]::Create($url)
$request.Method=[System.Net.WebRequestMethods+Ftp]::ListDirectory
$response=$request.GetResponse()
$reader=新对象IO.StreamReader$response.GetResponseStream()
$listing=$reader.ReadToEnd()
$reader.Close()
$response.Close()
$files=
($listing-split“`r`n”)|
其中对象{$\类似于“*.*”}
$webclient=新对象System.Net.webclient
foreach($files中的文件)
{
$tokens=$file-split“\ux”
$localPath=(连接路径$tokens[0]$tokens[1])
$localFilePath=(连接路径$localPath$file)
写入主机($file+“=>”+$localFilePath)
if(!(测试路径-路径$localPath))
{
新项-Path$localPath-ItemType目录| Out Null
}
$webclient.DownloadFile(($url+$file),$localFilePath)
}
如果您可以将您已经尝试过但不起作用的代码包含在内,那将非常有帮助。如果您可以将您已经尝试过但不起作用的代码包含在内,那将非常有帮助。谢谢!这真的很接近!它会抓取每个集合的三个文件,但不会抓取基础文件20160805_LUKDGUP或20160805_LUKSGUP。这是如何处理覆盖的?文件一次在上面5天,例如M1 T1 W1 Th1 F1,然后T1 W1 Th1 F1 M2,等等。但是我不认为如果以前的文件被覆盖会有什么大不了的。我已经修复了20160805\u LUKSGUP
+文件被覆盖的代码。它现在确实抓住了它们,但是它们被放在自己的文件夹LUKDGUP.SDL和LUKSGUP.SDL中。我真的很感谢你的帮助!什么是.SDL
?你的问题中没有提到。无论如何,SO不是一个代码编写服务。我已经向你展示了这个概念,其余的都由你来做。谢谢!这真的很接近!它会抓取每个集合的三个文件,但不会抓取基础文件20160805_LUKDGUP或20160805_LUKSGUP。这是如何处理覆盖的?文件一次在上面5天,例如M1 T1 W1 Th1 F1,然后T1 W1 Th1 F1 M2,等等。但是我不认为如果以前的文件被覆盖会有什么大不了的。我已经修复了20160805\u LUKSGUP
+文件被覆盖的代码。它现在确实抓住了它们,但是它们被放在自己的文件夹LUKDGUP.SDL和LUKSGUP.SDL中。我真的很感谢你的帮助!什么是.SDL
?你的问题中没有提到。无论如何,SO不是一个代码编写服务。我已经向你展示了这个概念,剩下的就交给你了。