PowerShell 使用名称列表复制文件

PowerShell 使用名称列表复制文件

我正在尝试编写一个 PowerShell 脚本,该脚本可以使用 .txt 文件作为搜索参数将文件复制到新目标。我遇到的问题是我没有完整的文件扩展名。

$sourceItemFolder = C:\Art_directory
$targetFolder = O:\Work_Folder
$FileList = C:\VbbList.txt

清单已列出

191428A1
191435A1
191431A1
191429A1
191430B1
191432A1

它们位于从 Excel 复制的一列中*

源项目文件夹有许多不同的文件夹,每个文件夹内都有每个前缀的变体。前缀是每个参考编号的前 6 个字符191428,变体是A1

子文件夹示例-

`C:\Art_directory\191428\191428A1 - Family Where Our Roots Grow Deep 1.625x7.25.jpg`


"191428A1 - Family Where Our Roots Grow Deep 1.625x7.25.jpg"` is the full file name.

我想要复制的文件始终是.jpg

该文件夹中大约有 14k 个文件夹Art_directory,因此,浏览这些文件夹并一次输入一个参考号有点麻烦。

一些较旧的文件夹在参考编号后面有描述,例如:

C:\Art_directory\191428 - Family Where Our Roots Grow Deep

是否可以使用 txt 文件作为 -Filter 或者是否有其他方法可以做到这一点?

答案1

以下是一种方法:

$sourceItemFolder = 'C:\Art_directory'
$targetFolder     = 'O:\Work_Folder'
$FileList         = 'C:\VbbList.txt'
$extFilter        = '*.jpg'

# $RefNums = Get-Content $FileList

$RefNums = @'
191428A1
191435A1
191431A1
191429A1
191430B1
191432A1 
'@ -Split '\n'  # Sustituting for Get-COntent for testing

ForEach ( $refNum in $RefNums ) {
    $gciSplat = @{ # splatted for readability
        'Path'    = ( Join-Path $sourceItemFolder $refNum.Remove(6) ) + '*' ### or "$sourceItemFolder\$($refNum.Remove(6))*"
        'Filter'  = $refNum + $extFilter
        'Recurse' = $True
        'Depth'   = 1
    }
    ForEach ( $foundFile in ( Get-ChildItem @gciSplat )) {
        Copy-Item -LiteralPath $_.FullName -Destination $targetFolder
    }
}

流水线:

$sourceItemFolder = 'C:\Art_directory'
$targetFolder     = 'O:\Work_Folder'
$FileList         = 'C:\VbbList.txt'
$extFilter        = '*.jpg'

Get-Content $FileList | ForEach{
    $gciSplat    = @{ # splatted for readability
        'Path'    = ( Join-Path $sourceItemFolder $_.Remove(6) ) + '*'
        'Filter'  = $_ + $extFilter
        'Recurse' = $True
        'Depth'   = 1
    }
### -WhatIf parameter included for testing. Remove to execute copy

    Get-ChildItem @gciSplat | Copy-Item -LiteralPath { $_.FullName } $targetFolder -WhatIf

### -WhatIf parameter included for testing. Remove to execute copy
}

只是为了笑,别名和硬编码路径来制作一行:

gc 'C:\VbbList.txt' | %{ gci "C:\Art_directory\$($_.Remove(6))*" "$_*.jpg" -Recurse -Depth 1 | copy -Literal { $_.FullName } $targetFolder -WhatIf }

做出的假设:

  • 名称源自 Refernce# 的文件夹均为$sourceItemFolder
  • 正在搜索的文件是子文件夹内的项目(即子文件夹的搜索是非重复的)

关于 Splatting

关于 ForEach(陈述)

ForEach 对象

答案2

就此而言。

“是否可以使用 txt 文件作为过滤器,或者是否有其他方法可以做到这一点?”

不。您需要循环使用该文件列表。读取文件并处理每一行。

$sourceItemFolder = 'C:\Art_directory'
$targetFolder     = 'O:\Work_Folder'
$FileList         = (Get-Content -Path 'C:\VbbList.txt')

$FileList | 
ForEach {
    "Processing $PSItem"
    # Other code here.
}

正如 Lee_Daily 所说,您确实没有提供足够的信息,没有文件内容示例、文件夹信息等;因此让我们只能猜测/假设。所有这些都不会带来潜在的有用响应。如果您只需要 .jpg,那么只需过滤您的副本即可。

# Validate your copy action
(Get-ChildItem -Path 'SomeFilePath' -Filter '*.jpg' -Recurse).FullName | 
Copy-Item -Destination 'SomeDestinationPath' -WhatIf
# remove the -WhatIf for thing to happen

相关内容