我有一个文件夹,其中包含以下文件名:
00150005D201110172338427995.vpf
00150005D201110180005318058.vpf
00150013D201110180014448082.vpf
00150013D201110180022268098.vpf
00150013D201110180056118137.vpf
00150004D201110180102008142.vpf
00150004D201110180105398145.vpf
00150016D201110180115378151.vpf
00150016D201110180122168161.vpf
00150003Z201110180143308169.vpf
00150050S201110180232190009.vpf
每个文件都以 9 个字符的字符串开头,这是一个唯一标识符。我希望能够解析这些文件夹中的每个文件,并根据 9 个字符的前缀创建一个具有前缀名称的文件夹,然后将文件移动到新创建的文件夹中。
例子:
前:
f:\ION\2011291 Contains the following files
00150005D201110172338427995.vpf
00150005D201110180005318058.vpf
00150013D201110180014448082.vpf
00150013D201110180022268098.vpf
00150013D201110180056118137.vpf
00150004D201110180102008142.vpf
00150004D201110180105398145.vpf
00150016D201110180115378151.vpf
00150016D201110180122168161.vpf
00150003Z201110180143308169.vpf
00150050S201110180232190009.vpf
后:
F:\ION\2011291 contins only folders no files
F:\ION\2011291\00150005D contains
00150005D201110172338427995.vpf
00150005D201110180005318058.vpf
F:\ION\2011291\00150013D\ contains
00150013D201110180014448082.vpf
00150013D201110180022268098.vpf
00150013D201110180056118137.vpf
F:\ION\2011291\00150004D \contains
00150004D201110180102008142.vpf
00150004D201110180105398145.vpf
F:\ION\2011291\00150016D\ contains
00150016D201110180115378151.vpf
00150016D201110180122168161.vpf
F:\ION\2011291\00150003Z\ contains
00150003Z201110180143308169.vpf
F:\ION\2011291\00150050S
00150050S201110180232190009.vpf
参数:
- 我需要在 Powershell 中执行此操作
- 我将非常感激关于如何实现这一目标的指导,我可以在哪里进一步阅读,甚至对实际脚本进行一些指导。
答案1
该脚本应该完成以下工作:
dir | %{
$id = $_.Name.SubString(0,8);
if(-not (Test-Path $id)) {mkdir $id};
mv $_ "$id\$_";}
解释:
目录中的 foreach 文件(% 是 foreach 的别名):
- 从前 9 个字符获取 id。请注意,$_ 变量是 powershell 填充的自动变量,表示当前文件。对象的 Name 属性返回一个.NET 字符串对象它有一个 SubString 成员函数,您可以使用它来返回您感兴趣的文件名部分。
- 检查“id”目录是否已存在。如果不存在,则创建它(mkdir 是 New-Item 的别名)。
- 然后将文件移动到目录中(mv 是 Move-Item 的别名)。请注意,当 powershell 看到双引号字符串内的变量时,它会自动将其值扩展为结果字符串。
请注意,我提供的示例假设您从文件所在的目录运行它。
答案2
你可以做这样的事情:
$Directory = "f:\ION\2011291";
$AllFiles = Get-ChildItem $Directory | where {$_.extension -eq ".vpf"};
$FileNames = New-Object System.Collections.ArrayList;
foreach($File in $AllFiles)
{
$FileNames.Add($File.Name.SubString(0,9));
}
$UniqueNames = $FileNames | get-unique;
foreach($Name in $UniqueNames)
{
New-Item $Directory\$Name -type directory
}
foreach($File in $AllFiles)
{
$Dir = $File.Name.SubString(0,9);
Move-Item $Directory\$File $Directory\$Dir\$File;
}
解释:
- 首先查找所有带有
$Directory
“.vdf”扩展名的文件 - 将所有文件名的前 9 个字母添加到
$FileNames
- 将每个唯一名称存储
$FileNames
到$UniqueNames
- 创建新目录并命名
$UniqueNames
- 根据前 9 个字符将每个文件移动到相应的目录中
如果脚本始终在存储文件的目录中运行,并且您不想按扩展名进行过滤,请查看@zdans 的回答以获得更紧凑、更优雅的解决方案。