将文件复制到 FTP 并以今天的日期存档

2024-01-13

我需要创建一个执行以下操作的脚本:

  1. 将文件夹中的所有文件复制到 FTP 站点。
  2. 如果复制成功,则将文件移至存档。
  3. 存档应该是一个新创建的文件夹,具有今天的日期(这样我们就知道它们何时被传输)。

我试图蚕食其他脚本来让某些东西发挥作用,但我没有取得任何进展,所以我需要一些帮助,我已经为此工作了几个小时。

我使用 WinSCP DLL 只是因为我的其他(工作)脚本使用需要它的 SFTP。我知道普通 FTP 不会,但我找不到任何易于传输的代码,因此尝试修改它。

所以,这是我的代码,它甚至无法运行,更不用说正确运行了,有人可以帮助我正确执行它吗?抱歉,有点乱。

param (
    $localPath = "c:\test\source",
    $remotePath = "/upload",
    $folder = ($_.CreationTime | Get-Date -Format yyyyMMdd)
    # not sure this works but don't see how to point the destination
    # to the newly created folder
    $backupPath = "c:\test\destination\$folder"  
)

try
{
    # Load WinSCP .NET assembly
    Add-Type -Path "C:\Windows\System32\WindowsPowerShell\v1.0\WinSCPnet.dll"

    # Setup session options
    $sessionOptions = New-Object WinSCP.SessionOptions -Property @{
        Protocol = [WinSCP.Protocol]::ftp
        HostName = "xxxxxxxx"
        UserName = "xxxxxxxx"
        Password = "xxxxxxxx"
    }

    $session = New-Object WinSCP.Session

    try
    {
        # Connect
        $session.Open($sessionOptions)

        # Upload files, collect results
        $transferResult = $session.PutFiles($localPath, $remotePath)

        # Iterate over every transfer
        foreach ($transfer in $transferResult.Transfers)
        {
            # Success or error?
            if ($transfer.Error -eq $Null)
            {
                # If today's folder doesn't exist, create it
                if (!(Test-Path $BackupPath))
                {
                    New-Item -ItemType Directory -Force -Path $BackupPath
                }

                Write-Host ("Upload of {0} succeeded, moving to Uploaded folder" -f
                    $transfer.FileName)
                # Upload succeeded, move source file to backup
                Move-Item $transfer.FileName $backupPath
            }
            else
            {
                Write-Host ("Upload of {0} failed: {1}" -f
                    $transfer.FileName, $transfer.Error.Message)
            }
        }
    }
    finally
    {
        # Disconnect, clean up
        $session.Dispose()
    }

    exit 0
}
catch [Exception]
{
    Write-Host ("Error: {0}" -f $_.Exception.Message)
    exit 1
}

这就是代码。我很高兴在 FTP 端使用内置的 PowerShell 来简化它,我只是希望它能够工作。


我不确定您对代码有什么担忧。设置时看起来很不错,除了语法错误$folder:

你为什么还要尝试使用$_.CreationTime作为文件夹时间戳?只需使用当前日期:

$folder = (Get-Date -Format "yyyyMMdd")

See 在 PowerShell 中格式化时间戳 https://winscp.net/eng/docs/script_formatting_timestamp_batch_file在 WinSCP 文档中。

我也没有看到设置点$folder and $backupPath in the params堵塞。将其移至params block. 如果您无论如何都想要这个,那么您在后面缺少了一个逗号$folder任务。


除此之外,您的代码应该可以工作。

您无法通过使用内置的 PowerShell(或更确切地说 .NET)FTP 功能来简化它,因为它没有像 WinSCP .NET 程序集那样强大的命令。


我将代码写为:

$localPath = "C:\source\local\path\*"
$remotePath = "/dest/remote/path/"
$folder = (Get-Date -Format "yyyyMMdd")
$backupPath = "C:\local\backup\path\$folder"

# If today's folder doesn't exist, create it
if (!(Test-Path $BackupPath))
{
    New-Item -ItemType Directory -Force -Path $BackupPath | Out-Null
}

try
{
    # Load WinSCP .NET assembly
    Add-Type -Path "WinSCPnet.dll"

    # Setup session options
    $sessionOptions = New-Object WinSCP.SessionOptions -Property @{
        Protocol = [WinSCP.Protocol]::ftp
        HostName = "ftp.example.com"
        UserName = "username"
        Password = "password"
    }

    $session = New-Object WinSCP.Session

    try
    {
        # Connect
        $session.Open($sessionOptions)

        # Upload files, collect results
        $transferResult = $session.PutFiles($localPath, $remotePath)

        # Iterate over every transfer
        foreach ($transfer in $transferResult.Transfers)
        {
            # Success or error?
            if ($transfer.Error -eq $Null)
            {
                Write-Host ("Upload of $($transfer.FileName) succeeded, " +
                    "moving to backup")
                # Upload succeeded, move source file to backup
                Move-Item $transfer.FileName $backupPath
            }
            else
            {
                Write-Host ("Upload of $($transfer.FileName) failed: " +
                    "$($transfer.Error.Message)")
            }
        }
    }
    finally
    {
        # Disconnect, clean up
        $session.Dispose()
    }

    exit 0
}
catch [Exception]
{
    Write-Host "Error: $($_.Exception.Message)"
    exit 1
}

基于上传成功后将本地文件移至其他位置 https://winscp.net/eng/docs/script_local_move_after_successful_upload.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将文件复制到 FTP 并以今天的日期存档 的相关文章

随机推荐

  • 如何抑制 Visual Studio 2017 (C#) 中的初始构建后事件错误?

    我在 Visual Studio 2017 中有一个 C 解决方案 我还有一个名为的批处理脚本foobar bat其中包含以下代码 echo foobar error 1 This is a test error 我的目标是得到only当我
  • new之后直接调用方法?

    PHP 是否允许像这样调用新对象的方法 new CEntry new Control gt actuate 我可以传递一个新对象作为参数 如下所示new Control 然而 它似乎不喜欢 actuate 调用 我收到错误 Parse er
  • 如何使用 C++ 中具有多个参数的 if 语句调用多个函数

    该程序针对每种条件运行所有函数 而它应该只针对每种条件运行一个函数 为什么 我应该编写计算球体 圆柱体和圆锥体的体积和表面积的函数 我无法弄清楚是 if 语句弄乱了 还是函数本身弄乱了 该程序的理想输出如下 选择形状 1 球体 2 圆柱体
  • 从 node-mysql 连接到 Amazon RDS (MySQL) 时出错

    我正在尝试使用 felixge node mysql 包从 Lambda 中托管的 Nodejs 代码连接到我的 Amazon RDS MySQL 实例 我需要帮助来找出我做错了什么 我收到 连接 ETIMEDOUT 错误 我的代码托管在
  • 不同源文件中的 D 模板特化

    我最近问this https stackoverflow com questions 6328444 type classes in d有关如何在 D 中模拟类型类的问题 并建议了一种使用模板专业化来实现此目的的方法 我发现 D 无法识别不
  • 基于不同XAML的样式继承

    如何将样式中的 BasedOn 标记指定为在其他文件中定义的样式 Example Dictionary1 xaml 定义 在 Dictionary2 xaml 中我需要类似的东西
  • 从 pandas 数据框中删除闰年日

    我有福尔 数据框 datetime 2012 01 01 125 5010 2012 01 02 125 5010 2012 01 03 125 5010 2012 02 04 125 5010 2012 02 05 125 5010 20
  • 我是否需要担心“Rc”的开销?

    我是否正确地假设唯一 放慢速度 的事情Rc问题是它会在对象删除时检查是否释放该对象 除此之外 取消引用的开销是 多少 Rc 即我应该关心它吗 这两个函数几乎同样快吗 或者说速度上有明显的区别吗 fn test with box let b
  • 日志记录和同步

    我刚刚编写了自己的日志框架 非常轻量级 不需要大型日志框架 它由一个接口 ILogger 和许多实现该接口的类组成 我有一个问题是 TGUILogger 它采用 TStrings 作为日志记录目标 并将日志记录与主线程同步 以便列表框的 I
  • Linux 中如何给线程命名? [复制]

    这个问题在这里已经有答案了 我有一个用 C C 编写的多线程 Linux 应用程序 我有为我的线程选择名称 https stackoverflow com questions 149932 naming conventions for th
  • Java正则表达式跳过匹配

    我有一些文字 我想提取不以标点符号分隔的单词对 这是代码 n grams Pattern p Pattern compile a z if n 2 p Pattern compile a z a z if n 3 p Pattern com
  • 如何在supervisor中添加延迟到受监督进程 - linux

    我添加了一个使用 python cassandra 库的 Bottle 服务器 但它存在以下错误 Bottle FATAL Exited too quickly process log may have details 日志显示 File
  • Android JNI 本机 C 函数调用杀死活动

    什么有效 我有一个运行 TUN TAP 服务的 c 可执行文件 以及两个在终端中运行良好的 shell 脚本 用于配置 ip 路由 和 iptables 全部以 root 身份运行 什么不起作用 我正在尝试创建一个 Android 应用程序
  • 如何在 Python 中提取字符串中的列表?

    我使用 Pandas 导入了 CSV 并用字符串条目读入了一列 检查本系列 专栏 的条目 我发现它们实际上应该是列表 例如 df A pd Series entry11 entry21 entry22 entry31 entry32 我想从
  • Windows批处理文件中的一个数字既大于又小于另一个

    我的批处理文件中有以下代码 if bakfilesize geq freespacet echo baksize is larger if bakfilesize leq freespacet echo baksize is smaller
  • 如何在服务生成器类中添加http拦截器

    我创建了一个单独的服务生成器类 如本指南所示https futurestud io tutorials retrofit 2 manage request headers in okhttp interceptor https future
  • 如何将 CSRF 令牌设置为不同的上下文路径

    我们基于 Angular 的 Web 应用程序与在不同域和上下文路径上运行的企业门户集成 我正在使用基于 Spring Security 的 CSRF 令牌来验证传入请求 该应用程序在本地完美运行 但当我将其与门户集成时 所有 post 调
  • pg_dump 串行数据类型问题

    有人可以向我解释一下为什么使用以下脚本创建 PostgreSQL 表 CREATE TABLE users id serial NOT NULL name character varying 150 NOT NULL surname cha
  • 开发 API - 如何确保其安全? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我将读取和写入方法放在数据库中 并通过 URL 公开它们 我使用 CodeIgniter 框架并使用 URL 段将参数传递给这些方法
  • 将文件复制到 FTP 并以今天的日期存档

    我需要创建一个执行以下操作的脚本 将文件夹中的所有文件复制到 FTP 站点 如果复制成功 则将文件移至存档 存档应该是一个新创建的文件夹 具有今天的日期 这样我们就知道它们何时被传输 我试图蚕食其他脚本来让某些东西发挥作用 但我没有取得任何