PowerShell 脚本将文件(但不包括子文件夹)复制到 SFTP,并在完成后移动到子文件夹

2024-04-16

我正在使用以下脚本将文件从本地文件夹复制到 SFTP。上传文件后,我想将文件移动到子文件夹中。我只想上传以下文件C:\Users\Administrator\Desktop\ftp文件夹,而不是其他子文件夹中的文件。

param (
    $backupPath = "C:\Users\Administrator\Desktop\ftp\moved"
)

# Load the Assembly and setup the session properties
try
{
    # Load WinSCP .NET assembly
    Add-Type -Path "C:\Program Files (x86)\WinSCP\WinSCPnet.dll" 

    $session = New-Object WinSCP.Session

    $filelist = Get-ChildItem C:\Users\Administrator\Desktop\ftp 

    # Connect And send files, then close session
    try
    {
        # Connect
        $session.Open($sessionOptions)

        $transferOptions = New-Object WinSCP.TransferOptions
        $transferOptions.TransferMode = [WinSCP.TransferMode]::Binary

        foreach ($file in $filelist)
        {
            $transferResult = $session.PutFiles("C:\Users\Administrator\Desktop\ftp\$file", "/", $False, $transferOptions)
            foreach ($transfer in $transferResult.Transfers)
            {
                Write-Host "Upload of $($transfer.FileName) succeeded"
                Move-Item $transfer.FileName $backupPath
            }
        }
    }
    finally
    {
        # Disconnect, clean up
        $session.Dispose()
    }

    exit 0
}
# Catch any errors
catch
{
    Write-Host "Error: $($_.Exception.Message)"
    exit 1
}

此时,如果我运行脚本下的所有文件moved文件夹也会通过SFTP文件夹上传,我只需要上传根目录下的文件即可ftp folder.

我想我需要在这里更改此行,但不确定如何更改它。

$filelist = Get-ChildItem C:\Users\Administrator\Desktop\ftp 

要跳过文件夹添加-File切换到Get-ChildItem (正如@Scepticalist 已经评论的那样):

$filelist = Get-ChildItem -File C:\Users\Administrator\Desktop\ftp 

尽管您可以使用更少的代码实现相同的目的,但如果您让 WinSCP 迭代文件(并跳过文件夹):

$transferOptions = New-Object WinSCP.TransferOptions
$transferOptions.TransferMode = [WinSCP.TransferMode]::Binary
$transferOptions.FileMask = "|*/" # Exclude the folders

$transferResult = $session.PutFiles(
    "C:\Users\Administrator\Desktop\ftp\*", "/", $False, $transferOptions)
foreach ($transfer in $transferResult.Transfers)
{
    Write-Host "Upload of $($transfer.FileName) succeeded"
    Move-Item $transfer.FileName $backupPath
}

而且你不需要任何Get-ChildItem call.

以上基本上是WinSCP文章中的代码上传成功后将本地文件移至其他位置 https://winscp.net/eng/docs/script_local_move_after_successful_upload,只需一个排除子文件夹 https://winscp.net/eng/docs/faq_script_non_recursive.


但请注意,您的代码(与文章相反)没有成功上传的测试。因此,您甚至可以移动无法上传的文件。确保添加$transfer.Error -eq $Null test.

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

PowerShell 脚本将文件(但不包括子文件夹)复制到 SFTP,并在完成后移动到子文件夹 的相关文章

  • Powershell添加系统变量

    我正在尝试使用 PowerShell 在此处添加系统变量 我已经尝试过两种方式使用 env MyTestVariable My test variable and Environment SetEnvironmentVariable Tes
  • 如何从 C 代码调用 powershell 脚本

    就我而言 我需要从 c 或 c 代码源调用 powershell 脚本 发现了一些非常笨拙且不适用于 c 的链接 我只是想要一个路线图 如果可能的话 调用列出代码中的目录内容的 powershell 脚本用 C 或 C 编写的片段 C 代码
  • 如何使用 PowerShell 递归合并/“展平”文件夹结构

    我正在寻求帮助来重组许多子文件夹中的大量文件 示例来源 folderX aaa txt bbb txt folderY ccc txt folderZ ddd txt eee txt 理想结果 folderX aaa txt folderX
  • powershell函数输出到变量

    我在 powershell 2 0 中有一个名为 getip 的函数 它可以获取远程系统的 IP 地址 function getip strComputer computername colItems GWMI cl Win32 Netwo
  • Powershell Invoke-RestMethod 字符不正确

    我正在使用 Invoke RestMethod 从我正在使用的应用程序中获取页面名称 我注意到 当我在页面上执行 GET 操作时 它会返回页面名称 如下所示 该页面正在运行 然而实际的页面名称是 此页面 正在运行 这是我的请求的样子 Inv
  • 从 powershell 执行时,WSL 中无法识别“uname -s”等命令

    我需要在 WSL 中执行以下命令 sudo curl L https github com docker compose releases download 1 23 2 docker compose uname s uname m o u
  • 如何获取邮件联系人所属的所有组?

    此代码将查找特定电子邮件帐户或mail user帐户所属 get group where object FilterScript Members contains user 但是 在 O365 中您可以拥有mail contacts谁不是用
  • 开始作业时无法识别功能

    我在模块 sysinfo psm1 中创建了一个函数 Get Uptime 并导入了该模块 C pstools gt get command Module sysinfo CommandType Name Definition Functi
  • 从 C# 运行 32 位或 64 位 PowerShell

    我构建了一个执行 PowerShell 脚本的 32 位 NET DLL 我需要它能够以 64 位模式运行脚本and 32 bit 我已经知道如何使用命令行执行此操作 C Windows Sysnative cmd c powershell
  • 发生错误时如何停止powershell脚本?

    我有一个 主 powershell 脚本 它执行多个在虚拟机上安装应用程序的脚本 我正在尝试在主脚本上实现错误控制 意思是 如果安装应用程序的脚本之一失败 则不会执行其余脚本 这是我的主要脚本 try powershell exe Exec
  • 如何在powershell中使用system.tuple?

    只是出于好奇 这不是 我必须拥有它 而是如何在 powershell 中使用 system tuple 类声明元组 我正在使用 powershell exe config 加载框架 4 0 但无法创建元组 尝试这个 PS C ps1 gt
  • 在 PowerShell 中解析大型 JSON 文件

    Context 在这篇文章中 ConvertFrom Json 大文件 https stackoverflow com q 76784490 268581 我询问有关反序列化 1 2GB JSON 文件的问题 这个答案发布在那里 https
  • 为路径创建别名

    是否可以在 PowerShell 中为路径创建别名 例如 我必须一直写下去 PS PS C Users Jacek gt cd C windows microsoft net framework v4 0 30319 如果我能写我会很高兴
  • 如何以编程方式将数据写入Azure Blob存储?

    我正在使用下面的 PowerShell 脚本通过 REST API 调用从源读取 JSON 数据 现在我想将 Result 的数据加载到 Azure Blob 存储中 有什么想法吗 Params URI https 3ea5e53b 817
  • 用于发布 APIM 开发人员门户的 Powershell 脚本[关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 I am planning to publish the developer portal using powershe
  • TFS:在服务器重新启动或 Windows 更新安装时触发构建的最佳方式

    简而言之 要求是验证我们最新发布的软件是否可以在应用最新的 Windows 更新和 或其他补丁后构建并安装 因此 构建服务器虚拟机将专门为此目的进行配置 并且构建仅需要在更新后运行 由于此类更新通常会重新启动 因此我正在考虑触发构建和部署的
  • 批处理文件中的 Powershell - 如何转义元字符?

    运行 Windows 7 当我复制文件在例程期间到外部磁盘文件备份 我使用 Powershell v2 从批处理文件 在副本文件上重新创建原始文件的所有时间戳 以下代码在大多数情况下都能成功运行 但并非总是如此 SET file 1 SET
  • 如何让 C# Cmdlet 参数 HelpMessage 显示在“Get-Help”中

    我已启动 PowerShell cmdlet 并希望提供参数的帮助消息 我尝试过使用ParameterAttribute HelpMessage为了这 Cmdlet VerbsCommon Get Workspace SupportsSho
  • 以管理员身份从 cmd 批处理运行 PowerShell 脚本

    我有一个 PowerShell 设置 我想在执行策略可能受到限制并且需要管理员权限的计算机上执行 理想情况下 我可以将其包装在 cmd 批处理中 如下所示 powershell Command Start Process powershel
  • 使用自签名证书签署 PowerShell 脚本(并且不使用 makecert.exe)

    我正在尝试签署一份 ps1使用自签名证书 用例是我自己在私人开发站上编写的脚本 因此无需使用 或付费 真正的 CA 但是 无论我阅读多少关于证书生成和数字签名主题的指南 我似乎都无法使其正常工作 这是我到目前为止所取得的成就 Create

随机推荐