【问题标题】:PowerShell Copy-Item: do I need a backslash at the end of my destination parameter?PowerShell Copy-Item:我的目标参数末尾是否需要反斜杠?
【发布时间】:2017-10-14 18:47:24
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: powershell


    【解决方案1】:

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

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

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

    【讨论】:

    • 我通读了那个讨论,一位成员写道:“至少在我常用的操作系统上,将斜线加倍没有问题。”这似乎在 PowerShell 中也适用
    【解决方案2】:

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

    不过,他并没有完全错。如果目标文件夹不存在,则目标路径中的尾部反斜杠确实会有所不同:

    PS C:\Temp> ls -r |选择模式,全名 | ft -AutoSize 模式全名 ---- -------- d---- C:\Temp\a -a--- C:\Temp\a\foo.txt PS C:\Temp> 复制项目 'C:\Temp\a\foo.txt' 'C:\temp\b' PS C:\Temp> ls -r |选择模式,全名 | ft -AutoSize 模式全名 ---- -------- d---- C:\Temp\a -a--- C:\Temp\b -a--- C:\Temp\a\foo.txt PS C:\Temp> 删除项目'C:\temp\b' PS C:\Temp> 复制项目 'C:\Temp\a\foo.txt' 'C:\temp\b\' Copy-Item:文件名、目录名或卷标语法不正确。 ...

    不存在的目标路径带有尾随反斜杠会引发错误,而没有尾随反斜杠的目标将创建为文件。

    但是,IMO 处理丢失目标文件夹的更好方法是实际检查它们是否存在,如果它们不存在则创建它们:

    if (-not (Test-Path -LiteralPath $destination -Type Container)) {
        New-Item -Type Directory -Path $destination | Out-Null
    }
    

    【讨论】:

    • 您的回答和@Zucchini 的回答都证明是有帮助的。我认为您的帖子将从更广泛的角度使其他人受益。我相信我的新思维模式将是,“如果它代表文件夹路径,则以斜杠结尾”,因为 PowerShell 似乎不关心双斜杠,但确实关心斜杠是否丢失。
    • 我不是这个意思。事实上,我建议不要在路径字符串中放置尾部反斜杠。进行适当的验证(如我的回答中所建议的那样)并通过 Join-Path cmdlet 构建路径。
    • 全面,为什么建议不要使用斜杠? Copy-Item 'C:\Temp\a\foo.txt' 'C:\temp\\b\' 尽管有错别字,但表现良好。另外,感谢您对Join-Path 的建议。问原始问题的部分原因是因为我正在与代码标准化作斗争,而且他们至少放松了让我使用该 cmdlet。我通常会执行路径验证或错误处理,但在我的特定上下文中,错误由依赖于捕获和响应它们的父环境处理。如果这偏离了 Q/A,我深表歉意
    • 当您点击我之前评论中的链接时,原因应该会很明显。
    • 我已关注您的链接。然而,除了揭示代码接收到糟糕的语法之外,它并没有表达Copy-Item 'C:\Temp\a\foo.txt' 'C:\temp\\b\' 的工作原理或可能的含义。不幸的是,我很难从互联网搜索中获得任何答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-12
    • 2016-06-27
    • 2013-12-05
    • 2010-11-30
    • 2011-09-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多