Arrays 使用powershell计算数组
我正在尝试创建一个数组,该数组将从目标路径删除文件,然后从源路径复制到目标路径。我在构建服务器上创建了一个.txt文档,其中包含一个文件列表及其相对路径。当我运行下面的代码块时,它将删除文件夹B中的所有内容,并将文件夹A(没有任何内容)复制到文件夹B 这就是我正在运行的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
$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我已经编辑了我的答案并添加了一个示例解决方案。如果您遇到错误,请将其包含在问题中,并使用代码或引号格式(以便于阅读)。我感谢您的帮助,我已使用收到的代码和错误编辑了我的问题。是否有新的错误消息?是否有新的错误消息?