powershell
2017-05-15 6 views 0 likes 
0

私は同僚との討論を終了するのに助けが必要です。私は、次のスクリプトを持っている:PowerShellコピーアイテム:ターゲットパラメータの最後にバックスラッシュが必要ですか?

$source = '\\serverA\folder' 
$destination = '\\serverB\folder' 
Copy-Item -Path "$source\myFile.txt" -Destination $destination 

私の同僚は、私はそれが$destination = '\\serverB\folder\'読み取るようにバックスラッシュが私の宛先パラメータの最後に追加されている必要がありと主張し、そうでない場合、私は予期せぬ合併症を有することができます。

したがって、上記の正確な構文でバックスラッシュが重要ですか?私がオンラインで見ているものから、コーダーによっては恣意的なようです。

答えて

0

あなたの同僚は、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 
} 
+0

@Zucchiniの答えと答えはどちらも参考になりました。私は、あなたの投稿がより広い視野から他の人に利益をもたらすと思います。 PowerShellは2倍のスラッシュを気にしていないようだが、スラッシュがない場合は気をつけているので、私は新しい考え方を "フォルダパスを表すならばスラッシュで終わる"と考えている。 –

+1

それは私が意味するものではありませんでした。実際には、パス文字列に後ろにバックスラッシュを入れないことをお勧めします。適切な検証を行い(私の答えで示唆されているように)、['Join-Path'](http://stackoverflow.com/a/17146630/1630171)コマンドレット経由でパスを構築します。 –

+0

徹底的に、後続のスラッシュに対してなぜ推薦が必要ですか? 'コピーアイテム 'C:\ Temp \ a \ foo.txt' 'C:\ temp \\ b \'は打ち間違いなしにうまくいきます。また、Join-Pathのアドバイスをありがとう。元の質問をする理由の1つは、コードの標準化と戦っていることです。少なくとも、そのコマンドレットを使用できるようにすることについては、ほっとしました。私は通常、パスの検証やエラー処理を行いますが、私の特定の状況では、エラーはそれらを捕まえて応答する親環境によって処理されます。それがQ/Aを迂回する場合はお詫び申し上げます。 –

1

私はpowershellで多くのファイルを扱いますが、私は常に自分のパスに最後の\を残していますが、実際に違いがあるかどうかは分かりません。あなたの同僚は正確な推論は何ですか?

また、スラッシュで終わるパスはディレクトリであり、1つのファイルで終わらないパスはファイルであると考えることもできます。私はそれが意見の問題だと確信しています。

編集は、以前に議論されたようです。 Should a directory path variable end with a trailing slash?

+0

私はその議論を読み、そしてメンバーは「書きました少なくとも一般的に使用するOSでは、スラッシュを2倍にしても問題はありません。これはPowerShellにも当てはまるようです。 –

関連する問題