通过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
相关产品推荐
相关产品推荐

