使用powershell

时间:2017-09-13 17:10:31

标签: arrays powershell foreach

我尝试创建一个数组,该数组将从目标路径中删除文件,然后从源路径复制到目标路径。我在构建服务器上创建了一个.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

纯碱,

这两项建议都不奏效。它仍然删除目标目录中的所有内容,并将源目录文件夹添加到目标目录而不包含文件。我在这里有点失落。

2 个答案:

答案 0 :(得分:0)

  1. 您缺少路径中的反斜杠,请使用Join-Path构建字符串以避免这种情况({em>或可能包含files.txt中的反斜杠

  2. 您在$dest$source上进行了迭代,但这些是字符串,而不是文件集合,您可以使用Get-ChildItem $destGet-ChildItem $source来检索这些字符串,实例

  3. 另外,为了便于阅读,您不应在脚本中使用别名(rdcp

    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
}