我在一个文件夹中存储了大量图像,并对它们进行排序,选择将哪些图像复制到特定文件夹(例如“风景”或“技术”),并在文本文件中为每个文件夹创建了部分文件名列表。例如 Scenery.txt
4811 4819 4820
这些是完整文件名的一部分的唯一文件编号,例如:
C:\Users\drewb\Pictures\2018_08_Inuvik\All\DSC_4811.jpg
我在 powershell 中有一个脚本,当我在 .txt 文件中列出了完整文件名时,这个脚本对我很有用,但为了节省时间,由于照片数量较多,我只写了图像编号。我希望有一种方法可以创建此列表的数组,并在循环中将其作为完整文件名中的变量输入,但任何建议都值得赞赏。
对我而言,使用 .txt 中的全名的代码是
Get-Content C:\Users\drewb\Pictures\2018_08_Inuvik\Technical.txt | ForEach-Object {copy-item $_ C:\Users\drewb\Pictures\2018_08_Inuvik\Technical}
已解决:我通过将文件路径与 Excel 中的名称和文件扩展名连接起来,然后使用我之前使用的 PS 脚本解决了这个问题。但是,我觉得一定有更直接的方法可以编写脚本。
答案1
简短回答
如果当前目录包含文件名遵循相同模式的图片DSC_XXXX.jpg
(其中XXXX
为数字)以及Technical.txt
包含其中一些数字的名为的文件,则以下命令会将Technical
文件中提供数字的所有文件复制到该文件夹(假设它存在于当前目录中)Technical.txt
:
Get-Content Technical.txt | ForEach-Object { Copy-Item "DSC_$_.jpg" Technical }
如果Technical.txt
图片文件和Technical
目录不在当前目录中,则必须提供完整路径或相对路径,例如:
Get-Content c:\path1\to\Technical.txt | ForEach-Object { Copy-Item "c:\path2\to\pictures\DSC_$_.jpg" c:\path3\to\Technical }
解释
- 命令中的表达式
"DSC_$_.jpg"
用于根据从文件读取的数字生成图片文件名Technical.txt
,该文件是当前管道对象(即$_
)。它只是添加DSC_
为前缀,并.jpg
添加为扩展名。 - 获取内容读取文件的内容
Technical.txt
。 - ForEach 对象
{}
对管道中的每个对象执行其脚本块参数(用花括号括起来,即),在本例中,即返回的每一行文本Get-Content
。
测试此解决方案(在线或本地)
最简单的方法就是尝试此解决方案在线。
否则,可以使用以下代码片段来创建在当前目录中一个test
文件夹,其中包含一个示例Technical.txt
文件和一些遵循此答案中提到的模式的假图片文件以及一个空Technical
目录(当心:如果工作目录中已经有一个文件夹,则必须更改.\test
为其他内容:test
mkdir -ErrorAction SilentlyContinue .\test\Technical
Out-File .\test\DSC_4811.jpg; Out-File .\test\DSC_4812.jpg; Out-File .\test\DSC_4813.jpg;
Out-File .\test\DSC_4814.jpg; Out-File .\test\DSC_4819.jpg; Out-File .\test\DSC_4820.jpg;
"4811`n4819`n4820" > .\test\Technical.txt
(在第三行中,`n
表示行尾字符(反引号 ( `
) 是转义字符在 PowerShell 中)。
它会生成以下文件:
.\test\DSC_4811.jpg .\test\DSC_4812.jpg .\test\DSC_4813.jpg
.\test\DSC_4814.jpg .\test\DSC_4819.jpg .\test\DSC_4820.jpg
.\test\Technical.txt
执行作为答案提供的命令后(Get-Content .\test\Technical.txt | ForEach-Object { Copy-Item ".\test\DSC_$_.jpg" .\test\Technical }
),文件为:
.\test\DSC_4811.jpg .\test\DSC_4812.jpg .\test\DSC_4813.jpg
.\test\DSC_4814.jpg .\test\DSC_4819.jpg .\test\DSC_4820.jpg
.\test\Technical.txt
.\test\Technical\DSC_4811.jpg .\test\Technical\DSC_4819.jpg .\test\Technical\DSC_4820.jpg
清理方法:
ri -Recurse .\test