我正在尝试编写一个 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
- 正在搜索的文件是子文件夹内的项目(即子文件夹的搜索是非重复的)
关于 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