我尝试创建一个数组,该数组将从目标路径中删除文件,然后从源路径复制到目标路径。我在构建服务器上创建了一个.txt文档,其中包含一个文件列表及其相对路径。当我运行下面的代码块时,它删除文件夹B中的所有内容并将文件夹A(没有任何内容)复制到文件夹B.
这就是我正在运行的
$files = get-content "C:\files.txt"
foreach ($filepath in $files)
{
$source = '\\Server1\Folder A' + $filepath
$dest = '\\Server2\Folder B' + $filepath
foreach ($removefile in $dest)
{
rd $removefile -recurse -force
}
foreach ($addfile in $source)
{
cp $addfile -destination $dest
}
}
纯碱,
我已尝试过您的建议,但它正在尝试从错误的目录中删除/复制。
代码:
$targetList = Get-Content "C:\MCSfiles.txt"
foreach ($target in $targetList) {
$destPath = Join-Path "\\Server2\MCSWebTest" $target
$destFiles = Get-ChildItem $destPath
foreach ($file in $destFiles) {
Remove-Item $file -Recurse -Force
}
$sourcePath = Join-Path "\\Server1\WebSites\McsWeb2" $target
$sourceFiles = Get-ChildItem $sourcePath
foreach ($file in $sourceFiles) {
Copy-Item $file -Destination $destPath
}
}
错误:
删除项目:无法找到路径' C:\ Program Files(x86)\ Jenkins \ jobs \ MCSTest \ workspace \ App_Code'因为它不存在 在C:\ Users \ SVC-VI~1 \ AppData \ Local \ Temp \ jenkins5893875881898738781.ps1:9> char:1 9 + Remove-Item<<<< $ file -Recurse -Force + CategoryInfo:ObjectNotFound:(C:\ Program> File ... kspace \ App_Co de:String)[Remove-Item],ItemNotFoundException + FullyQualifiedErrorId:PathNotFound,Microsoft.PowerShell.Commands.Remov eItemCommand
复制项目:无法找到路径' C:\ Program Files(x86)\ Jenkins \ jobs \ MCSTest \ works 步伐\ App_Code文件'因为它不存在 在C:\ Users \ SVC-VI~1 \ AppData \ Local \ Temp \ jenkins5893875881898738781.ps1:16> char: 18 + Copy-Item<<<< $ file -Destination $ destPath + CategoryInfo:ObjectNotFound:(C:\ Program> File ... kspace \ App_Co de:String)[Copy-Item],ItemNotFoundException + FullyQualifiedErrorId:PathNotFound,Microsoft.PowerShell.Commands.CopyI temCommand
纯碱,
这两项建议都不奏效。它仍然删除目标目录中的所有内容,并将源目录文件夹添加到目标目录而不包含文件。我在这里有点失落。
答案 0 :(得分:0)
您缺少路径中的反斜杠,请使用Join-Path
构建字符串以避免这种情况({em>或可能包含files.txt
中的反斜杠
您在$dest
和$source
上进行了迭代,但这些是字符串,而不是文件集合,您可以使用Get-ChildItem $dest
和Get-ChildItem $source
来检索这些字符串,实例
另外,为了便于阅读,您不应在脚本中使用别名(rd
和cp
)
PS:我相信您的脚本会产生错误,您应该将它们包含在您的问题中(you can edit it)
关于评论的编辑:
尝试此操作(未经测试,删除-WhatIf
&#39}来处理):
$targetList = Get-Content "D:\files.txt"
foreach ($target in $targetList) {
$destPath = Join-Path "D:\destination" $target
Remove-Item $destPath -Recurse -Force -WhatIf
$sourcePath = Join-Path "D:\source" $target
Copy-Item $sourcePath -Destination $destPath -Recurse -WhatIf
}
EDIT2:我已经纠正并简化了上面的代码,我的逻辑略有偏差。
这甚至可以更简单,更好,将删除语句分组并在复制语句之前运行它们,例如:
$targetList = Get-Content "D:\files.txt"
#remove all
$targetList | ForEach-Object {
Remove-Item (Join-Path "D:\destination" $_) -Recurse -Force -WhatIf
}
#copy all
$targetList | ForEach-Object {
Copy-Item (Join-Path "D:\source" $_) (Join-Path "D:\destination" $_) -Recurse -Force -WhatIf
}
两个代码段都已使用示例文件夹结构进行测试。
为了完整起见,我第一次尝试时遇到的错误是由于将$file
个对象传递给处理cmdlet而不是完整路径($file.FullName
)。
答案 1 :(得分:0)
问题是您尝试循环太多次。外循环一次处理一个文件。应该没有内部循环。另外,您在发布删除文件之前并没有验证文件是否存在。
$files = Get-Content "C:\test.txt"
$source_base="C:\TEMP\source\"
$dest_base="C:\TEMP\dest\"
foreach ($filepath in $files)
{
$source = $source_base + $filepath
$dest = $dest_base + $filepath
if(Test-Path $dest) {rd $dest -recurse -force}
cp $source -destination $dest
}