2011-09-16 150 views
0

我有一個相當有趣的問題。Powershell FTP上傳與恢復

我創建了一個腳本來壓縮並上傳(帶簡歷)一些文件到FTP帳戶。本地在我的機器,它工作正常,但在生產環境中我得到這個錯誤:

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

異常調用「放」與「3」的說法(S):「找不到文件「C:\ ByAndrew \ PowerShell的\交易\ System.IO.FileStream」「。

在行:1字符:9

  • $ ftp.Put(< < < < $ FILESTREAM,$ file.name,$真);

下面是腳本:

$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 

< < < < < < < < < < < < < < < < < < < < 我不理解的錯誤。什麼是「無法找到文件」C:\ ByAndrew \ PowerShell \ Transactions \ System.IO.FileStream'。「 我的意思是'路徑\對象' 有沒有人會遇到過這種行爲?有小費嗎?

最好的問候, 安德魯


更新:

今天我已經檢查從生產環境中引用的程序集版本: MSCOREE.DLL [2.0.50727.1433] - .NET 20 SP1 本地我有[2.0.50727.3053] - .net 20 sp2 爲了排除這個問題,我用.net 20 sp1查找了一臺機器。將錯誤 - >更新.net複製到2.0 SP2並檢查它。同樣的問題。這就是爲什麼我說..我不認爲「依賴」是錯誤的。

問候, 安德魯

+0

問題:是'Indy.Sockets。你的生產計算機上有dll嗎?在你的本地機器需要所有組件的地方?在本地機器上的'C:\ ByAndrew \ PowerShell \ Transactions'路徑中可以找到什麼?有沒有由'Indy.Sockets.dll'引用的程序集? – JPBlanc

+0

是的,它可用這個路徑: 「c:\ ByAndrew \ PowerShell \ Transactions \ IndyFTP \ Indy.Sockets.dll」 不。它不在我的本地計算機上。 我已將從本地機器複製的文件夾放置在生產環境中的不同路徑中,並調整了設置以匹配新路徑。 引用的程序集是「mscoree.dll」。我不認爲這個大會有問題。我測試過了,看起來很好。 –

回答

1

你爲什麼叫$ file.OpenRead(),然後在下一行創建一個新的FileStream對象?此外,沒有一個新的FileStream的重載將FileInfo對象作爲構造函數的第一個參數。我可以看到你使用$ file.FullName作爲第一個參數,儘管我甚至會在生產/開發區別之前查看那些行作爲可疑行爲...

如果您不需要所有特殊屬性指示。如何打開文件,我只需要使用.OpenRead()方法 - 它已經返回一個FileStream對象。如果您需要這些選項,請刪除OpenRead()行。

此外,在調用.Close()之後包含$ fileStream.Dispose()調用是一個好主意 - 甚至可以代替它,因爲Dispose也會關閉該流。這也有釋放相關句柄的好處。

+0

感謝您的回答。 「$ file.OpenRead()」在我的代碼#前面 - 它被評論。 此處的編輯器不支持以#開頭的行。我認爲它被自動刪除。 我首先使用了帶有相同結果/錯誤的「$ file.OpenRead()」方法。 我會嘗試使用「$ file.FullName」,但我懷疑我會得到相同的錯誤。感謝您的提示。 –