C#プログラムでPSCPを使用して、UnixマシンからWindowsマシンにファイルをコピーするときに問題が発生します。この問題は、Windowsマシンのターゲットフォルダにスペースがある場合にのみ発生します。たとえば、次のコードは正常に機能します(注:この例ではIPアドレスとパスワードが変更されています)。
pscp.exe -pw MyPassword [email protected]:/etc/myfolder/myfile.opt C:\download
しかし、これを次のように変更すると、
pscp.exe -pw MyPassword [email protected]:/etc/myfolder/myfile.opt C:\download files
次のエラーが表示されます。複数のリモートソースがサポートされていません。
PSCPがスペースを別のターゲットとして解釈するためです。しかし、どうすればよいですか?引用符で囲んだり、スペースをエスケープしたりするなど、あらゆることを試しました。私は以下のすべてを試しましたが、何も機能しません:
pscp.exe -pw MyPassword [email protected]:/etc/myfolder/myfile.opt "C:\download files"
pscp.exe -pw MyPassword [email protected]:/etc/myfolder/myfile.opt C:\"download files"
pscp.exe -pw MyPassword [email protected]:/etc/myfolder/myfile.opt C:\download\\ files
何か案は?
適切な答えはおそらくWinSCPとそのC#ライブラリを使用することですが、ターゲットフォルダーにスペースがあるときにPSCPを機能させる方法を見つけました。
正解はこれを行うことです:
pscp.exe -pw MyPassword [email protected]:/etc/myfolder/myfile.opt "C:\download files"
上記の方法ではうまくいかないと私に思わせる別の問題があったことがわかりました。元々、私はPSCP.EXE実行可能ファイルへのフルパスを使用していました。フルパスにはスペースが含まれています。だから私は次のことをやろうとしました:
"C:\My PSCP Folder\pscp.exe" -pw MyPassword [email protected]:/etc/myfolder/myfile.opt "C:\download files"
そして私はProcess.Start()を使用してC#からそれを呼び出そうとしていましたが、失敗しました。 PSCPパスまたはターゲットパスのいずれかにスペースがあり、両方にはスペースがない場合は、それを処理できるように見えました。 Windows環境変数にPSCP実行可能ファイルへのパスを含めることで、これを修正しました。これで、PSCP.EXEを呼び出すだけで、ターゲットフォルダーの前後の引用符で動作します。
宛先フォルダにピリオドを追加します。以下は、例に追加された。で動作するはずです。
"C:\My PSCP Folder\pscp.exe" -pw MyPassword [email protected]:/etc/myfolder/myfile.opt "C:\download files\."
pscp.exe -pw MyPassword [email protected]:/etc/myfolder/myfile.opt "C:\download files"
最初に、すでに述べたように、パスにスペースが含まれています。したがって、 "C:\ download files"という引用符を使用するのが賢明でしょう。次に、すでに指摘したように、奇妙なパスなしでpscpを呼び出すには、アプリケーションをPATHに追加する必要があります。そして三番目。すべてを引用することによって引き起こされるこの混乱を防ぐ命名規則を使用してください。
camelCaseNaming
underscore_naming
どちらも問題を解決し、あなたは100500倍涼しく見えます。