PowerShell Copy-Item:我的目标参数末尾是否需要反斜杠?

时间:2017-05-15 20:58:37

标签: powershell

我需要帮助结束与同事的辩论。我有以下脚本:

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

我的同事声称我需要在目标参数的末尾添加一个反斜杠,以便它显示为$destination = '\\serverB\folder\',否则我可能会出现无法预料的并发症。

那么,反斜杠是否在我上面的精确语法中提供了至关重要的?从我在网上看到的情况看,它似乎是随意的,取决于编码员。

2 个答案:

答案 0 :(得分:1)

我在powershell中做了很多文件处理,而且我总是忽略了我的路径中的最后一个文件,但是我不确定它是否真的有所作为。你的同事准确推理是什么?

您还可以认为以斜杠结尾的路径是目录,而不是以一个结尾的路径是文件。我很确定这是一个意见问题。

编辑,似乎之前已经讨论过了。 Should a directory path variable end with a trailing slash?

答案 1 :(得分:0)

您的同事可能会将PowerShell与VBScript混淆。如果目标是文件夹,则VBScript的CopyFileCopyFolder方法需要尾随反斜杠。只要文件夹存在,PowerShell的Copy-Item cmdlet就不关心目标是否有反斜杠。

但是,他并非完全错误。如果目标文件夹不存在,则目标路径中的尾部反斜杠确实会产生影响:

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
}