web-dev-qa-db-ja.com

Powershell:ファイル名から最初の文字列を取得し、文字列からディレクトリを作成してから、ファイルを移動します

次のファイル名のフォルダがあります。

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. これをどのように達成するかについての指示をいただければ幸いです。実際のスクリプトに関するガイダンスをさらに読むことができます。
6
JRG

このスクリプトは次の仕事をするはずです:

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

説明:

ディレクトリ内のforeachファイル(%はforeachのエイリアスです):

  • 最初の9文字からIDを取得します。 $ _変数は、現在のファイルを表すPowerShellによって入力される自動変数であることに注意してください。オブジェクトのNameプロパティは 。NET String object を返します。これには、関心のあるファイル名の部分を返すために使用できるSubStringメンバー関数があります。
  • 「id」ディレクトリがすでに存在するかどうかを確認します。そうでない場合は、作成します(mkdirはNew-Itemのエイリアスです)。
  • 次に、ファイルをディレクトリに移動します(mvはMove-Itemのエイリアスです)。 PowerShellは、二重引用符で囲まれた文字列内の変数を検出すると、その値を結果の文字列に自動的に展開することに注意してください。

私が提供する例は、ファイルがあるディレクトリから実行していることを前提としていることに注意してください。

6
zdan

あなたはこのようなことをすることができます:

$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. まず、拡張子が「.vdf」の$Directory内のすべてのファイルを検索します
  2. すべてのファイル名の最初の9文字を$FileNamesに追加します
  3. $FileNamesから$UniqueNamesにそれぞれの一意の名前を保存します
  4. $UniqueNamesの名前で新しいディレクトリを作成します
  5. 最初の9文字に基づいて、各ファイルを対応するディレクトリに移動します

スクリプトが常にファイルが保存されているディレクトリで実行され、拡張子でフィルタリングしたくない場合は、@ zdansの回答を参照してよりコンパクトでエレガントなソリューションを探してください。

1