【问题标题】:Powershell FTP Upload with resume带简历的 Powershell FTP 上传
【发布时间】:2011-11-18 16:05:06
【问题描述】:

我遇到了一个相当有趣的问题。

我创建了一个脚本来压缩和上传(带简历)一些文件到 FTP 帐户。在我的机器上本地运行良好,但在生产环境中出现此错误:

PS> $ftp.Put($fileStream,$file.name,$true);

使用“3”参数调用“Put”的异常:“找不到文件 'C:\ByAndrew\PowerShell\Transactions\System.IO.FileStream'。”

在 line:1 char:9

  • $ftp.Put(

这是脚本:

$xml = New-Object XML

$xml.Load(".\settings.xml")

[void][Reflection.Assembly]::LoadFrom("D:\Work\Projects\ProjectIndyFTP\Bin\Indy.Sockets.dll")

$ftp = new-object Indy.Sockets.FTP

$ftp.Host = $xml.list.ftp.server

$ftp.Port = $xml.list.ftp.port

$ftp.Username = $xml.list.ftp.user

$ftp.Password = $xml.list.ftp.pass

$ftp.ConnectTimeout = 600

$ftp.Connect()

$file = Get-Item "D:\Work\Projects\ProjectIndyFTP\TestFolder\TestFiles\testfile5M.bin"
#$fileStream = $file.OpenRead()
$fileStream = New-Object System.IO.FileStream($file,[System.IO.FileMode]::Open,[System.IO.FileAccess]::Read,[System.IO.FileShare]::ReadWrite)
$ftp.Put($fileStream,$file.name,$true);
$fileStream.Close()
$ftp.Quit()
exit

最好的问候, 安德鲁


更新:

今天我检查了生产环境中引用的程序集版本: mscoree.dll [2.0.50727.1433] - .net 20 sp1 在本地我有 [2.0.50727.3053] - .net 20 sp2 为了排除这个问题,我查找了一台带有 .net 20 sp1 的机器。重现错误-> 将 .net 更新到 2.0 sp2 并检查它。同样的问题。这就是为什么我说..我不认为“依赖”是错误的。

问候, 安德鲁

【问题讨论】:

  • 问题:Indy.Sockets.dll 在您的生产计算机上可用吗?与需要所有组件的本地机器在同一个地方?在本地机器上的C:\ByAndrew\PowerShell\Transactions 路径中可以找到什么? Indy.Sockets.dll 没有引用任何程序集?
  • 是的,它可用此路径:"c:\ByAndrew\PowerShell\Transactions\IndyFTP\Indy.Sockets.dll" 不。它与我的本地计算机上的位置不同。我已经从本地计算机复制了文件夹,并将其放置在生产环境中的不同路径中,并调整了设置以匹配新路径。引用的程序集是“mscoree.dll”。我不认为该程序集有问题。我已经测试过了,看起来不错。

标签: powershell upload ftp filestream indy


【解决方案1】:

为什么你调用 $file.OpenRead() 然后在下一行创建一个新的 FileStream 对象?此外,新 FileStream 的所有重载都不会将 FileInfo 对象作为构造函数的第一个参数。我可以看到您使用 $file.FullName 作为第一个参数,尽管在了解生产/开发差异之前我会认为这些行是可疑的......

如果您不需要指示 .NET 如何打开文件的所有特殊属性,我将只使用 .OpenRead() 方法 - 它已经返回一个 FileStream 对象。如果您需要这些选项,请删除 OpenRead() 行。

此外,在调用 .Close() 之后包含一个 $fileStream.Dispose() 调用是一个好主意 - 或者甚至代替它,因为 Dispose 也会关闭流。这也有释放关联句柄的好处。

【讨论】:

  • 感谢您的回答。 “$file.OpenRead()”在我的代码 # 前面 - 它已被注释。此处的此编辑器不支持以 # 开头的行。我认为它已被自动删除。我首先使用了具有相同结果/错误的“$file.OpenRead()”方法。我会尝试使用“$file.FullName”,但我怀疑我会得到同样的错误。感谢您的提示。
猜你喜欢
  • 2013-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-22
  • 1970-01-01
  • 2012-08-06
  • 2011-01-20
  • 2013-02-03
相关资源
最近更新 更多