【问题标题】:unexpected structure when copying folders in Windows Powershell在 Windows Powershell 中复制文件夹时出现意外结构
【发布时间】:2018-06-06 11:05:08
【问题描述】:

我有一组项目,其中包含项目特定文件和公共文件的混合。我正在尝试将两个不同文件夹(一个项目特定文件夹和一个公用文件夹)中的内容复制到为该项目命名的单个文件夹中。我还想保留原始文件夹中的所有文件夹层次结构。

例如一些常用文件的路径:

src\Common\PackageAssets\logo1.jpg
src\Common\PackageAssets\logo2.jpg

以及项目特定文件的示例路径:

src\Projects\ProjectA\PackageFiles\readme.txt
src\Projects\ProjectA\PackageFiles\scale-100\projA.png

复制后想要的结果是:

bld\ProjectA\pkgFiles\logo1.png
bld\ProjectA\pkgFiles\logo2.png
bld\ProjectA\pkgFiles\readme.txt
bld\ProjectA\pkgFiles\scale-100\projA.png

我用的是这个:

[string]$pkgContentPath = "bld\$project\pkgFiles"

# copy common files
Copy-Item -Path .\src\Common\PackageAssets -Recurse -Destination $pkgContentPath
# copy project-specific files
Copy-Item -Path .\src\Projects\ProjectA\PackageFiles\ -Recurse -Destination $pkgContentPath

但与预期结果不同的是,所有文件最终都位于额外级别的子文件夹中:

bld\ProjectA\pkgFiles\PackageAssets\logo1.png
bld\ProjectA\pkgFiles\PackageAssets\logo2.png
bld\ProjectA\pkgFiles\PackageFiles\readme.txt
bld\ProjectA\pkgFiles\PackageFiles\scale-100\projA.png

我被难住了。我不知道如何摆脱额外的子文件夹层。我尝试使用 Get-ChildItem 管道连接到 Copy-Item,但随后子文件夹层次结构丢失了。

在 .bat 文件中,这是有效的:

xcopy src\Common\PackageAssets\* bld\%project\pkg_contents /s
xcopy src\Projects\%project\PackageFiles bld\%project\pkg_contents /s

我想我可以使用 xcopy,但肯定有办法使用 cmdlet 来做到这一点。

【问题讨论】:

  • New-Item bld\ProjectA\pkgFiles -Type Directory; Copy-Item -Path .\src\Common\PackageFile\* bld\ProjectA\pkgFiles -Recurse; Copy-Item -Path .\src\Projects\ProjectA\PackageFiles\* bld\ProjectA\pkgFiles -Recurse
  • 还有什么奇怪的是,当我在控制台和脚本中运行命令时,结果是不同的。

标签: windows powershell


【解决方案1】:

不幸的是,您描述的行为是 known problem 从 Windows PowerShell v5.1 / PowerShell Core v6.2.0-preview.2 开始:

简而言之,Copy-Item 的行为很遗憾地取决于目标目录是否已经存在:

如果是目标目录。存在,复制的不是源目录的content,而是源目录。 作为一个整体,到以源目录命名的目标目录的子目录。


解决方法已经在PetSerAl对该问题的有用评论中详细说明:

  • 复制前,请确保目标目录存在。

  • 将\* 附加到源路径以明确定位源目录的内容。

    • 还要指定-Force,以确保隐藏文件和目录也被复制。
$pkgContentPath = "bld\$project\pkg_contents"

# Make sure the target dir. exists.
# (-Force leaves an existing dir alone and otherwise creates it.)
New-Item -Force -Type Directory $pkgContentPath

# IF desired, clear out the pre-existing directory content.
# !! Beware of Remove-Item's intermittent failures - see below.
#  Remove-Item -Force $pkgContentPath\* -Recurse.

# Copy with \* appended to the source paths and -Force added:
#
# copy common files
Copy-Item -Recurse -Force -Path .\src\Common\PackageAssets\* $pkgContentPath
# copy project-specific files
Copy-Item -Recurse -Force -Path .\src\Projects\ProjectA\PackageFiles\* $pkgContentPath

如果需要,可以重新使用 Remove-Item -Recurse 清除预先存在的目标目录内容:遗憾的是,Remove-Item 有时会失败,您无法预测何时会发生这种情况 - 请参阅 @987654323 @ 一个强大的替代方案。

【讨论】:

  • 就我而言,我已经创建了目标文件夹,但仍然存在问题。但是,我没有附加 *,这确实有所作为。
猜你喜欢
  • 1970-01-01
  • 2015-07-16
  • 1970-01-01
  • 1970-01-01
  • 2017-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多