【发布时间】:2019-12-16 12:17:00
【问题描述】:
我的 PowerShell 脚本将文件放入 ESB 时遇到问题。 通常它会起作用,但并非总是如此,尤其是在大文件时会出错。有没有人看到我的脚本中的错误或解决/解决我的问题的方法?
注意:
- 恢复支持不是一个选项,因为我没有更改权限。
- 使用“WinSCP GUI”我成功地上传了大文件。 (恢复支持关闭)
- 监视包含要上传文件的目录以创建文件,然后将文件复制到单独的文件夹以进行上传。上传成功后,文件被删除(从第二个文件夹)。
- 我是 PowerShell 的初学者,所以可能有错误的原因。英语也不是我的母语,如有错误请见谅。
脚本在TaskScheduler中启动:
Powershell.exe -NoExit -File "script.ps1"
这是脚本:
$folder = 'Original_Folder'
$filter = '*.xml'
$destination = 'CopyTo_Folder'
$fsw = New-Object IO.FileSystemWatcher $folder, $filter -Property @{
IncludeSubdirectories = $false
NotifyFilter = [IO.NotifyFilters]'FileName, LastWrite'
}
$onCreated = Register-ObjectEvent $fsw Created -SourceIdentifier FileCreated -Action {
$path = $Event.SourceEventArgs.FullPath
$name = $Event.SourceEventArgs.Name
$changeType = $Event.SourceEventArgs.ChangeType
$timeStamp = $Event.TimeGenerated
Write-Host "$timeStamp The file '$name' was $changeType and copied for SFTP to $destination"
"$timeStamp The file '$name' was $changeType and copied for SFTP to $destination" | Set-Content 'Powershell_Script.log'
Copy-Item $path -Destination $destination -Force -Verbose
# Load WinSCP .NET assembly
Add-Type -Path "C:\Program Files (x86)\WinSCP_5_11_3\WinSCPnet.dll"
# Set up session options
$sessionOptions = New-Object WinSCP.SessionOptions -Property @{
Protocol = [WinSCP.Protocol]::Sftp
HostName = "ftp-server"
UserName = "User account"
Password = "User password"
SshHostKeyFingerprint = "ssh-rsa bla bla"
}
$sessionOptions.AddRawSettings("FSProtocol", "2")
$session = New-Object WinSCP.Session
$Session.SessionLogPath="WinSCP.log"
try
{
# Connect
$session.Open($sessionOptions)
# Upload files
# Set up transfer options
$transferOptions = New-Object WinSCP.TransferOptions -Property @{
ResumeSupport = New-Object WinSCP.TransferResumeSupport -Property @{ State = [WinSCP.TransferResumeSupportState]::Off }
}
# Upload with transferoptions and delete original when succesfull
$transferResult=$session.PutFiles("CopyTo_Folder\*", "/Upload_Folder on ftp-server/", $True, $transferOptions)
# Throw on any error
$transferResult.Check()
# Print results
foreach ($transfer in $transferResult.Transfers)
{
Write-Host "Upload of $($transfer.FileName) succeeded"
"$timeStamp The file $($transfer.FileName) was successfully uploaded" | Add-Content 'Powershell_Script.log'
}
}
finally
{
$session.Dispose()
}
}
【问题讨论】:
-
出现错误怎么办?部分文件传输?文件完全坏了?什么都没发生?
-
感谢您回答 vonPryz。有时会传输部分文件并且缺少部分内容。屏幕输出什么也没说,就好像它仍在监视一样。顺便说一下,脚本的启动方式是:Powershell.exe -NoExit -File "script.ps1"
-
向我们显示有问题的会话的 WinSCP 会话日志文件 (
Session.SessionLogPath)。 -
我很想,但是当文件没有完成时,没有日志。我想脚本挂起。
-
是否有日志文件,何时上传有效?如果有,那么在上传文件的一部分时,还必须有一个日志文件。 -- 没有日志的唯一情况是脚本甚至没有到达
Open调用 - 或者日志永远无法正常工作。
标签: powershell upload filesystemwatcher winscp