对,我有一个简单的Copy-Item
脚本,用于将文件从一个目标文件夹复制到另一个目标文件夹。
[CmdletBinding()]
param(
[Parameter(Mandatory=$true)]
[string]$source,
[Parameter(Mandatory=$true)]
[string]$destination
)
Process {
Copy-Item -Path $source -Destination $destination -Recurse -Force
我正在使用以下命令行运行releasecode.ps1
:
。\ releasecode.ps1-源“ C:\ test \ from”-目标“ C:\ test \ to”
from
文件夹具有以下结构:
.
├── from
├── stain.txt
├── test1.txt
├── folder
| ├── test2.bmp
此文件正确复制到(在第一份副本上):
.
├── to
├── stain.txt
├── test1.txt
├── folder
| ├── test2.bmpthe
如果我随后直接重新运行它,那么from
文件夹将被创建为`to'中的目录,而不仅仅是覆盖现有结构:
.
├── to
├── stain.txt
├── test1.txt
├── folder
| ├── test2.bmp
├── from
| ├── stain.txt
| ├── test1.txt
| └── folder
| ├── test2.bmp
如果文件和文件夹当前存在,如何覆盖现有的to
目录结构。
在Windows Box上运行此
$PSVersionTable
:
答案 0 :(得分:1)
您遇到了与复制源目录有关的Copy-Item
陷阱。
如果目标存在并且是文件夹,则cmdlet将源复制到目标。
Copy-Item C:\src\a C:\dst\b -Recurse C:\ C:\ ├─dst ├─dst | └─b | └─b └─src | └─a └─a ⇒ | ├─bar.txt ├─bar.txt | └─baz.txt └─baz.txt └─src └─a ├─bar.txt └─baz.txt
如果目标不存在,则cmdlet将源复制为目标。
Copy-Item C:\src\a C:\dst\b -Recurse C:\ C:\ ├─dst ├─dst └─src | └─b └─a | ├─bar.txt ├─bar.txt ⇒ | └─baz.txt └─baz.txt └─src └─a ├─bar.txt └─baz.txt
在PowerShell中处理此问题的常用方法是确保首先存在目标文件夹,然后然后复制源文件夹的 content :
if (-not (Test-Path $destination)) {
New-Item -Type Directory -Path $destination | Out-Null
}
Copy-Item -Path $source\* -Destination $destination -Recurse -Force
或者,您可以使用robocopy
,它没有此问题:
robocopy C:\src\a C:\dst\b /s