如何解决尽管输入了正确的路径,但无法传输多个文件
虽然输入了正确的路径,但无法传输多个文件
######Transfer file
Write-Host ("Start script.")
try
{
$todaysDate = (Get-Date).ToString('yyyy-MM-dd')
Add-Type -Path "D:\WinSCP\WinSCPnet.dll"
# Setup session options
$session = New-Object WinSCP.Session
$sessionOptions = New-Object WinSCP.SessionOptions
$sessionOptions.Protocol = [WinSCP.Protocol]::Sftp
$SessionOptions.Timeout = New-TimeSpan -Seconds 90
$sessionOptions.HostName = "hostname"
$sessionOptions.UserName = "username"
$sessionOptions.PortNumber = "portnumber"
$sessionOptions.Password = ""
$sessionOptions.SshPrivateKeyPath = "D:\privatekey"
$sessionOptions.SshHostKeyFingerprint = "ssh-rsa 2048 xxxxxx"
#Write-Host ("Connecting.")
$session = New-Object WinSCP.Session
$session.SessionLogPath = "D:\WinSCPSessionLog_$todaysDate.log"
#Upload files
try
{
# Connect
$session.Open($sessionOptions)
#File list:
Write-Host ("File list: ")
#transferoptions
$transferOptions = New-Object WinSCP.TransferOptions
#$transferOptions.FileMask = "*.*"
$transferOptions.FilePermissions = $Null # This is default
$transferOptions.PreserveTimestamp = $False # if Timestamp on file is enable
$localPath = Get-ChildItem "D:\dq\*.csv" | Where-Object {($_.LastWriteTime -ge [datetime]::today)}
$remotePath = "/Outbox/"
# Upload files,collect results
$transferResult = $session.PutFiles($localPath,$remotePath,$False,$transferOptions)
# Upload files,collect results
#$transferResult = $session.PutFiles(($localPath + "*.*"),($remotePath,+ "*.*") $False,$transferOptions).Check()
# Iterate over every transfer
foreach ($transfer in $transferResult.Transfers)
{
# Success or error?
if ($transfer.Error -eq $Null)
{
#$transferResult = $session.PutFiles($localPath,$transferOptions).Check()
Write-Host ("Upload of {0} succeeded,moving to save" -f $transfer.FileName)
}
else
{
Write-Host ("Upload of {0} failed: {1}" -f $transfer.FileName,$transfer.Error.Message)
}
}
#End of files:
Write-Host ("End of files. ")
}
finally
{
# Disconnect,clean up
$session.Dispose()
Write-Host ("Disconnected.")
}
#exit 0
}
catch [Exception]
{
$todaysDate = (Get-Date).ToString('yyyy-MM-dd')
Set-Content -Path "D:\WinSCPError_$todaysDate.log" $_.Exception.Message
#exit 1
}
日志文件:
文件列表: 上传 D:\dq\ADD.csv D:\dq\MINUS.csv D:\dq\DIVIDE.csv 失败:文件或文件夹 'D:\dq\ADD.csv D:\dq\MINUS.csv D: \dq\DIVIDE.csv' 不存在。 系统错误。代码:123。 文件名、目录名或卷标语法不正确
错误:
- 由于文件不存在,无法传输文件。我输入正确
工具:
- 使用极好的旧版本 .NET
- 使用极好的旧版窗口服务器
预期结果:
- 可以在“D:\dq*.csv”中传输多个文件,文件修改日期必须是今天的日期
解决方法
我输入正确
不,你没有。来自 localPath
参数的 WinSCP documentation:
要上传的本地文件或目录的完整路径。路径中的文件名可以替换为 Windows 通配符 1 以选择多个文件。要上传目录中的所有文件,请使用掩码 *.
也就是说,它期望一条路径,而不是多条路径。
鉴于您对 LastWriteTime
的过滤要求,将 "D:\dq\*.csv"
作为参数传递不是一个可行的选择,因此解决方案是逐个上传文件:
# ...
try{
# Connect
$session.Open($sessionOptions)
#File list:
Write-Host ("File list: ")
#transferoptions
$transferOptions = New-Object WinSCP.TransferOptions
#$transferOptions.FileMask = "*.*"
$transferOptions.FilePermissions = $Null # This is default
$transferOptions.PreserveTimestamp = $False # if Timestamp on file is enable
# Loop through each relevant file
foreach($localFile in Get-ChildItem "D:\dq\*.csv" | Where-Object {($_.LastWriteTime -ge [datetime]::today)}){
$remotePath = "/Outbox/"
# Upload files,collect results
$transferResult = $session.PutFileToDirectory($localFile.FullName,$remotePath,$false,$transferOptions)
# Success or error?
if ($transferResult.Error -eq $Null) {
#$transferResult = $session.PutFiles($localPath,$False,$transferOptions).Check()
Write-Host ("Upload of {0} succeeded,moving to save" -f $transferResult.FileName)
}
else {
Write-Host ("Upload of {0} failed: {1}" -f $transferResult.FileName,$transferResult.Error.Message)
}
}
}
finally{
# ...
}
,
@Martias 的回答是正确的。您不能将多个路径传递给 Session.PutFiles
。
但是您可以让 WinSCP 自己选择今天的 *.csv
文件,只需两行代码,使用 todays
constraint。
使用 Session.PutFilesToDirectory
也会使代码更简单一些。
$transferOptions = New-Object WinSCP.TransferOptions
# (your other transfer options)
$transferOptions.FileMask = ">=today"
$transferResult =
$session.PutFilesToDirectory(
$localPath,"*.csv",$transferOptions).Check()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。