You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过VM会话使用Copy-Item复制文件时,目标目录含方括号报错

解决PowerShell远程会话中Copy-Item到含方括号路径的问题

核心原因

PowerShell的Copy-Item默认会把方括号[]当作通配符解析,远程会话中常规的转义方式(反引号、WildcardPattern转义)会因为参数传递的解析顺序失效,导致路径识别错误。以下是几种可行的解决方案:


方法1:使用LiteralPath参数绕过通配符解析

LiteralPath参数会完全按字面解析路径,不处理任何通配符,是解决这类问题最直接的方式。

场景1:远程会话内复制文件

# 创建VM会话
$vmSession = New-PSSession -VMName "你的VM名称" -Credential (Get-Credential)

# 在远程会话执行复制,用LiteralPath指定路径
Invoke-Command -Session $vmSession -ScriptBlock {
    Copy-Item -LiteralPath "C:\远程源路径\test.txt" -Destination "C:\[dest]\"
}

场景2:从本地复制到远程会话

把本地文件传到远程带方括号目录时,可结合Invoke-Command在远程端用LiteralPath处理目标路径:

$localFile = "C:\本地文件.txt"
$remoteDest = "C:\[dest]\"

Invoke-Command -Session $vmSession -ScriptBlock {
    Copy-Item -Path $using:localFile -Destination (Get-Item -LiteralPath $using:remoteDest).FullName -ToSession $using:vmSession
}

方法2:直接调用.NET文件操作方法

.NET的IO类不会解析PowerShell通配符,可绕过Copy-Item的路径解析问题。

远程会话内复制

Invoke-Command -Session $vmSession -ScriptBlock {
    # 第三个参数$true表示覆盖已存在的文件
    [System.IO.File]::Copy("C:\远程源文件.txt", "C:\[dest]\目标文件.txt", $true)
}

本地文件传到远程

# 读取本地文件为字节数组
$fileContent = [System.IO.File]::ReadAllBytes("C:\本地文件.txt")

# 在远程会话写入文件
Invoke-Command -Session $vmSession -ScriptBlock {
    param($bytes, $savePath)
    [System.IO.File]::WriteAllBytes($savePath, $bytes)
} -ArgumentList $fileContent, "C:\[dest]\目标文件.txt"

方法3:临时重命名目标目录(Workaround)

如果前两种方法无法生效,可临时重命名带方括号的目录,复制完成后再恢复名称:

Invoke-Command -Session $vmSession -ScriptBlock {
    # 重命名目录避开方括号
    Rename-Item -LiteralPath "C:\[dest]\" -NewName "temp_dest"
    # 执行复制
    Copy-Item "C:\远程源文件.txt" -Destination "C:\temp_dest\"
    # 恢复原目录名称
    Rename-Item -LiteralPath "C:\temp_dest\" -NewName "[dest]"
}

内容的提问来源于stack exchange,提问作者stManPWR

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 09:07:32