WinSCP 脚本将所有匹配掩码的文件递归上传到同一文件夹
WinSCP Script upload recursivelly all files matching a mask to the same folder
我有一个从批处理文件调用的文本文件,它没有将文件递归地放入 FTP 站点。文件夹结构有子文件夹,其中包含我要在许多其他文件中复制的文件。 put 文件只复制 C:\storage
而已。阅读文档并尝试其他方法后仍然无法递归复制文件。 (没有要使用子文件夹中的 RDF 复制的文件夹)
文件夹结构在不同 PC 上是随机的:
- C:\storage286.S-92A.920024*.RDF
- C:\Storage\folder1286.S-92A.920024*.RDF
- C:\Storage\storage2\folder2286.S-92A.920024*.RDF
RDF 文件很多,但我感兴趣的通配符是您在上面看到的那个。基本上我想 select 所有 *.RDF(作为上面所有子文件夹的通配符),但不希望将子文件夹复制到远程。
请看下面的代码。
option batch continue
option confirm off
option reconnecttime 900
open ftp://companyuser:!password@ftpsite.com/
lcd "C:\storage"
put "C:\storage286.S-92A.920024*.RDF" "/"
put "C:\storage\*286.S-92A.920024*.RDF" "/"
close
exit
查看 https://winscp.net/eng/docs/commandline
上的文档
您可以使用命令行winscp.com
你的脚本看起来不错,应该需要用 winscp.com
调用
对于 Linux 上的 ftp 客户端,mput/mget(多文件操作),命令可用但 WinScp 不可用。
您可以尝试一些解决方法,例如首先使用 mkdir 命令(使用 winscp.com)创建文件夹,然后使用 synchronize
选项和 winscp.exe
来更新文件夹内容。
仅使用 WinSCP 脚本进行此类自定义处理并不容易。
但是有了WinSCP .NET assembly from a PowerShell script,就不难了:
# Load WinSCP .NET assembly
Add-Type -Path "WinSCPnet.dll"
# Set up 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
Write-Host "Connecting ..."
$session.Open($sessionOptions)
$localPath = "C:\storage"
$remotePath = "/"
$wildcard = "78286.S-92A.920024*.RDF"
$localFiles = Get-ChildItem -Include $wildcard -Recurse -Path $localPath
foreach ($localFile in $localFiles)
{
Write-Host "Uploading $($localFile.FullName)..."
$session.PutFiles($localFile.FullName, $remotePath).Check()
}
只需提取 WinSCP .NET assembly package 的内容以及脚本(比如 flatupload.ps1
)和 运行 就像:
powershell -ExecutionPolicy Bypass -File flatupload.ps1
代码部分基于 WinSCP 示例 Recursively move files in directory tree to/from SFTP/FTP server while preserving source directory structure。
另见 WinSCP 论坛问题 Ignore folder structure when copying the files。
我有一个从批处理文件调用的文本文件,它没有将文件递归地放入 FTP 站点。文件夹结构有子文件夹,其中包含我要在许多其他文件中复制的文件。 put 文件只复制 C:\storage
而已。阅读文档并尝试其他方法后仍然无法递归复制文件。 (没有要使用子文件夹中的 RDF 复制的文件夹)
文件夹结构在不同 PC 上是随机的:
- C:\storage286.S-92A.920024*.RDF
- C:\Storage\folder1286.S-92A.920024*.RDF
- C:\Storage\storage2\folder2286.S-92A.920024*.RDF
RDF 文件很多,但我感兴趣的通配符是您在上面看到的那个。基本上我想 select 所有 *.RDF(作为上面所有子文件夹的通配符),但不希望将子文件夹复制到远程。
请看下面的代码。
option batch continue
option confirm off
option reconnecttime 900
open ftp://companyuser:!password@ftpsite.com/
lcd "C:\storage"
put "C:\storage286.S-92A.920024*.RDF" "/"
put "C:\storage\*286.S-92A.920024*.RDF" "/"
close
exit
查看 https://winscp.net/eng/docs/commandline
上的文档您可以使用命令行winscp.com
你的脚本看起来不错,应该需要用 winscp.com
对于 Linux 上的 ftp 客户端,mput/mget(多文件操作),命令可用但 WinScp 不可用。
您可以尝试一些解决方法,例如首先使用 mkdir 命令(使用 winscp.com)创建文件夹,然后使用 synchronize
选项和 winscp.exe
来更新文件夹内容。
仅使用 WinSCP 脚本进行此类自定义处理并不容易。
但是有了WinSCP .NET assembly from a PowerShell script,就不难了:
# Load WinSCP .NET assembly
Add-Type -Path "WinSCPnet.dll"
# Set up 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
Write-Host "Connecting ..."
$session.Open($sessionOptions)
$localPath = "C:\storage"
$remotePath = "/"
$wildcard = "78286.S-92A.920024*.RDF"
$localFiles = Get-ChildItem -Include $wildcard -Recurse -Path $localPath
foreach ($localFile in $localFiles)
{
Write-Host "Uploading $($localFile.FullName)..."
$session.PutFiles($localFile.FullName, $remotePath).Check()
}
只需提取 WinSCP .NET assembly package 的内容以及脚本(比如 flatupload.ps1
)和 运行 就像:
powershell -ExecutionPolicy Bypass -File flatupload.ps1
代码部分基于 WinSCP 示例 Recursively move files in directory tree to/from SFTP/FTP server while preserving source directory structure。
另见 WinSCP 论坛问题 Ignore folder structure when copying the files。