Arrays 使用powershell计算数组

Arrays 使用powershell计算数组,arrays,powershell,foreach,Arrays,Powershell,Foreach,我正在尝试创建一个数组,该数组将从目标路径删除文件,然后从源路径复制到目标路径。我在构建服务器上创建了一个.txt文档,其中包含一个文件列表及其相对路径。当我运行下面的代码块时,它将删除文件夹B中的所有内容,并将文件夹A(没有任何内容)复制到文件夹B 这就是我正在运行的 $files = get-content "C:\files.txt" foreach ($filepath in $files) { $source = '\\Server1\Folder A' + $filepath

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

我尝试过你的建议,但它试图从/复制到错误的目录

代码:

错误:

删除项:找不到路径“C:\Program Files(x86)\Jenkins\jobs\MCSTest\workspace\App\u Code”,因为它不存在。 在C:\Users\SVC-VI~1\AppData\Local\Temp\jenkins5893875881898738781.ps1:9>char:1 9 +删除项目
  • 路径中缺少反斜杠,请使用
    连接路径
    构建字符串以避免出现这种情况(或者可能在
    文件.txt中包含前导反斜杠)

  • 您可以在
    $dest
    $source
    上进行迭代,但这些是字符串,而不是文件集合,您应该能够使用
    Get ChildItem$dest
    Get ChildItem$source
    检索它们

  • 此外,为了可读性,您不应该在脚本中使用别名(
    rd
    cp

    PS:我相信你的脚本会产生错误,你应该把它们包括在你的问题中()

    编辑有关评论:

    尝试此操作(未测试,请删除要处理的
    -WhatIf
    ):

    EDIT2:我已经更正并简化了上面的代码,我的逻辑有点不正确。

    将remove语句分组并在copy语句之前运行它们可能更简单、更好,如:

    $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

  • 路径中缺少反斜杠,请使用
    连接路径
    构建字符串以避免出现这种情况(或者可能在
    文件.txt中包含前导反斜杠)

  • 您可以在
    $dest
    $source
    上进行迭代,但这些是字符串,而不是文件集合,您应该能够使用
    Get ChildItem$dest
    Get ChildItem$source
    检索它们

  • 此外,为了可读性,您不应该在脚本中使用别名(
    rd
    cp

    PS:我相信你的脚本会产生错误,你应该把它们包括在你的问题中()

    编辑有关评论:

    尝试此操作(未测试,请删除要处理的
    -WhatIf
    ):

    EDIT2:我已经更正并简化了上面的代码,我的逻辑有点不正确。

    将remove语句分组并在copy语句之前运行它们可能更简单、更好,如:

    $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
    )。

    问题是您尝试循环的次数太多。外部循环一次处理一个文件。不应该有内部循环。此外,在发出删除之前,您不会验证文件是否存在

    $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
    }
    

    问题是您尝试循环的次数太多。外部循环一次处理一个文件。不应该有内部循环。此外,在发出删除之前,您不会验证文件是否存在

    $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
    }
    

    前导反斜杠包含在files.txt中。发生的第一件事是它删除\Server2\文件夹B下的所有内容,然后在找不到要删除的路径时开始抛出错误。删除项:无法删除项\\LTR1MCS04\MCSWebTest:进程无法访问文件“\\Server2\Folder B”,因为它正被另一个进程使用。删除项:找不到路径“\\Server2\Folder B\bin\filname.dll”,因为它不存在。我不确定在哪里添加Get-ChildItem命令。@Kerry我已经编辑了我的答案并添加了一个示例解决方案。如果您遇到错误,请将其包含在问题中,并使用代码或引号格式(为了可读性)。我感谢您的帮助,我已使用收到的代码和错误编辑了我的问题。前面的反斜杠包含在files.txt中。发生的第一件事是它删除\Server2\文件夹B下的所有内容,然后在找不到要删除的路径时开始抛出错误。删除项:无法删除项\\LTR1MCS04\MCSWebTest:进程无法访问文件“\\Server2\Folder B”,因为它正被另一个进程使用。删除项:找不到路径“\\Server2\Folder B\bin\filname.dll”,因为它不存在。我不确定在哪里添加Get-ChildItem命令。@Kerry我已经编辑了我的答案并添加了一个示例解决方案。如果您遇到错误,请将其包含在问题中,并使用代码或引号格式(以便于阅读)。我感谢您的帮助,我已使用收到的代码和错误编辑了我的问题。是否有新的错误消息?是否有新的错误消息?