从FTP检索文件,根据文件名在服务器上进行组织

时间:2016-08-08 21:37:13

标签: batch-file ftp

我们有两个由S& P计算的自定义指数。 S& P将8个文件(每个索引4个)上传到我可以访问的FTP服务器文件夹。它们每天晚上上传,然后我在第二天早上取回它们。我希望这是自动化的,因为它们一次只能在服务器上维护5天。

以下是示例文件名:

  

20160805_LUKDGUP
  20160805_LUKDGUP_NCS
  20160805_LUKDGUP_NCS_ADJ
  20160805_LUKDGUP_NCS_CLS
  20160805_LUKSGUP
  20160805_LUKSGUP_NCS
  20160805_LUKSGUP_NCS_ADJ
  20160805_LUKSGUP_NCS_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
   )
)

Source.当然这不涉及FTP自动化,但我想我可以通过Filezilla或其他一些FTP软件来解决这个问题。在我们的服务器上进行组织就是这篇文章试图解决的问题。

1 个答案:

答案 0 :(得分:0)

不要试图在批处理文件中破解它。

在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 = New-Object IO.StreamReader $response.GetResponseStream() 
$listing = $reader.ReadToEnd()
$reader.Close()
$response.Close()

$files =
    ($listing -split "`r`n") |
    Where-Object {$_ -like "*_*"}

$webclient = New-Object System.Net.WebClient 

foreach ($file in $files)
{
    $tokens = $file -split "_"
    $localPath = (Join-Path $tokens[0] $tokens[1])
    $localFilePath = (Join-Path $localPath $file)
    Write-Host ($file + " => " + $localFilePath)

    if (!(Test-Path -Path $localPath))
    {
        New-Item -Path $localPath -ItemType directory | Out-Null
    }

    $webclient.DownloadFile(($url + $file), $localFilePath)
}