あなたの同僚は、PowerShellとVBScriptを混同している可能性があります。宛先がフォルダの場合、VBScriptのCopyFile
およびCopyFolder
メソッドでは末尾に円記号が必要です。 PowerShellのCopy-Item
コマンドレットでは、フォルダーが存在する限り、宛先にバックスラッシュが付いているかどうかは関係ありません。
彼は完全に間違っていません。バックスラッシュは、無し末尾の円記号に対し、エラーをスローと
PS C:\Temp>ls -r | select Mode, FullName | ft -AutoSize
Mode FullName
---- --------
d---- C:\Temp\a
-a--- C:\Temp\a\foo.txt
PS C:\Temp>Copy-Item 'C:\Temp\a\foo.txt' 'C:\temp\b'
PS C:\Temp>ls -r | select Mode, FullName | ft -AutoSize
Mode FullName
---- --------
d---- C:\Temp\a
-a--- C:\Temp\b
-a--- C:\Temp\a\foo.txt
PS C:\Temp>Remove-Item 'C:\temp\b'
PS C:\Temp>Copy-Item 'C:\Temp\a\foo.txt' 'C:\temp\b\'
Copy-Item : The filename, directory name, or volume label syntax is incorrect.
...
存在しない宛先パス:先のフォルダが宛先パスの末尾に円記号が存在しない場合の違いを生むん宛先はファイルとして作成されます。
はしかし、不足している先のフォルダに対処するためのIMOより良い方法は、実際に自分の存在を確認し、それらが存在しない場合は、それらを作成することです:
if (-not (Test-Path -LiteralPath $destination -Type Container)) {
New-Item -Type Directory -Path $destination | Out-Null
}
@Zucchiniの答えと答えはどちらも参考になりました。私は、あなたの投稿がより広い視野から他の人に利益をもたらすと思います。 PowerShellは2倍のスラッシュを気にしていないようだが、スラッシュがない場合は気をつけているので、私は新しい考え方を "フォルダパスを表すならばスラッシュで終わる"と考えている。 –
それは私が意味するものではありませんでした。実際には、パス文字列に後ろにバックスラッシュを入れないことをお勧めします。適切な検証を行い(私の答えで示唆されているように)、['Join-Path'](http://stackoverflow.com/a/17146630/1630171)コマンドレット経由でパスを構築します。 –
徹底的に、後続のスラッシュに対してなぜ推薦が必要ですか? 'コピーアイテム 'C:\ Temp \ a \ foo.txt' 'C:\ temp \\ b \'は打ち間違いなしにうまくいきます。また、Join-Pathのアドバイスをありがとう。元の質問をする理由の1つは、コードの標準化と戦っていることです。少なくとも、そのコマンドレットを使用できるようにすることについては、ほっとしました。私は通常、パスの検証やエラー処理を行いますが、私の特定の状況では、エラーはそれらを捕まえて応答する親環境によって処理されます。それがQ/Aを迂回する場合はお詫び申し上げます。 –