Powershell:从文件名获取初始字符串并从字符串创建目录,然后移动文件


6

我有一个包含以下文件名的文件夹:

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

参数:

  1. 我需要在Powershell中执行此操作
  2. 我将非常感谢有关如何完成此工作的指导,在这里我可以阅读甚至甚至更多有关实际脚本的指南。

Answers:


6

该脚本应完成以下工作:

dir | %{ 
    $id = $_.Name.SubString(0,8); 
    if(-not (Test-Path $id)) {mkdir $id}; 
    mv $_ "$id\$_";}

说明:

目录中的foreach文件(%是foreach的别名):

  • 从前9个字符中获取ID。请注意,$ _变量是由powershell填充的代表当前文件的自动变量。该对象的Name属性返回一个.NET String对象,该对象具有SubString成员函数,可用于返回感兴趣的文件名部分。
  • 检查“ id”目录是否已经存在。如果没有,请创建它(mkdir是New-Item的别名)。
  • 然后将文件移到目录中(mv是Move-Item的别名)。请注意,当powershell在双引号字符串内看到一个变量时,它将自动将其值扩展为结果字符串。

请注意,我提供的示例假设您是从文件所在的目录运行它的。


mkdir不是别名而是函数。
Helge Klein

1

您可以执行以下操作:

$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;
}

说明:

  1. 首先找到$Directory带有“ .vdf”扩展名的所有文件
  2. 将所有文件名中的前9个字母添加到 $FileNames
  3. 存储从每一个独特的名字$FileNames进入$UniqueNames
  4. 创建新目录中的名称 $UniqueNames
  5. 根据前9个字符将每个文件移动到相应目录中

如果脚本将始终在文件存储的目录中运行,并且您不想按扩展名筛选,请查看@zdans答案以获取更紧凑,更优雅的解决方案。


你能提供一些指导吗?
塔玛拉·维斯曼
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.