4

頻繁にサブフォルダーに移動する必要のあるログファイルの束でいっぱいになるフォルダーがあります。たとえば、次のファイルを矢印のディレクトリに配置する必要があります。

SOME_FILE_341213.txt-> SMPROD
SOME_FILE_341242.txt-> SMPROD
OTHER_FILE_13423.log-> SSBRPRD
ALTER_FILE_13423.log-> SSBRPRD
geofile12321-> REGIONPROD

ファイル名の一部を解析して、そのファイル名の解析を含むディレクトリに移動するソリューションをたくさん見てきました。私の場合、宛先ディレクトリは、ファイル名の解析された部分と実際には一致しません。switchステートメントを使用して、最初の4文字または5文字を、ファイルを適切なディレクトリに移動するケースに一致させることができると考えていましたが、それが最も効率的な方法かどうかはわかりません。一致するケースは約25個あります。いずれの場合にも一致しなかったファイルについては、そのままにしておきます。何かアドバイス?

4

4 に答える 4

0

for-eachループでswitchステートメントを使用します。このようなもの:

$Files = Dir c:\test

foreach ($file in $files) {
    switch ($file.ToString().Substring(0,2)) {
        "te" {Write-Host "te"; break}
        "li" {Write-Host "li"; break}
        "ts" {Write-Host "ts"; break}

    } #End switch
} #End foreach

substring(x,y)コマンドでは、オーバーロードは次のとおりです。

  1. x=開始文字
  2. y=プルする文字数

write-host明らかに、を実際にやりたいことと置き換えてください。switchステートメントは複数行にまたがることができます。最後にあることを忘れないbreakでください。そうすれば、すべてのファイルについて25のオプションすべてを実行する必要はありません。

于 2012-10-25T17:51:04.287 に答える
0

スイッチに問題はありません。個人的にこのようなもののために私はハッシュテーブルを好むでしょう。何かのようなもの:

$dirInfo = @{'SOME' = 'SMPROD';
             'OTHE' = 'SSBRPRD';
             'ALTE' = 'SSBRPRD';
             'GEOF' = 'REGIONPROD'
            }

$prefix = $file.Name.Substring(0,4).ToUpper()
if($dirInfo.ContainsKey($prefix)){
    $moveDir = 'C:\PATH\TO\SOMEFOLDER\{0}' -f $dirInfo[$prefix]
    Move-Item $file $moveDir
}
于 2012-10-25T17:51:39.720 に答える
0

switchステートメントをハードコーディングするのではなく、キーと値のペアを含むテキストファイルからハッシュテーブルを作成するでしょう。これは、Powershellに精通していない人なら誰でも、ファイル名と宛先の関係を管理できることを意味します。これがより効率的かどうかはわかりませんが、ファイル名や宛先が変更された場合にスクリプトを更新する必要がないことを意味します。

簡単な例を次に示します...コピーは行いませんが、方法を示します。

$hashData = ConvertFrom-StringData ([IO.File]::ReadAllText("c:\temp\_sotemp\_hash\hashfile.txt"))
$directory = 'C:\Temp\_sotemp'
Get-ChildItem $directory |  
    where {!($_.PsIsContainer)} | 
    Foreach-Object {
    Foreach ($key in $hashData.GetEnumerator()){ 
        if ($_.name.substring(0,7) -eq $key.Name){
        Write-Host $_.fullname " will be copied to: " $key.Value
        }
    }
}

注意すべき点がいくつかあります。まず、Get-Content CMDLetを使用して、キーと値のペアを含むテキストファイルを読み取らないでください。ハッシュテーブルに対して奇妙なことが行われる可能性があるため、ハッシュのハッシュが発生する可能性があります。次に、7文字未満のファイル名を渡すと、部分文字列メソッドはエラーをスローします。これを処理することをお勧めしますか?

テキストファイルの内容は次のとおりです。

geofile=c:\\temp\\_sotemp\\REGIONPROD
other_f=c:\\temp\\_sotemp\\SSBRPRD
alter_f=c:\\temp\\_sotemp\\SSBRPRD
some_fi=c:\\temp\\_sotemp\\SMPROD
于 2012-10-25T17:57:04.087 に答える
0

別のスイッチバージョン。


Get-ChildItem "C:\temp" | foreach {
   switch -regex ($_.Name) {
      "^g.+" { write-output "$_.Name --> REGIONPROD"; break }
      "^S.+" { write-output "$_.Name  --> SMPROD" ; break }
      "^[O|A].+" { write-output "$_.Name  --> SSBRPRD" ; break }
   }
}

そして、ファイルからのターゲットディレクトリを持つ別のハッシュバージョン。


$hash = @{}
Get-Content C:\temp\hashData.txt | foreach { if ($_ -notmatch  "^$") {
   $fn, $dn = $_.split("|"); $hash.Add($fn, $dn) }
}

Get-ChildItem "C:\temp" | foreach {
   $fn = $_.Name.Substring(0,2)
   Write-Host "$_.Name   --> "  $hash.Item($fn)
}

これが私がテストに使用したhashData.txtです。

So | SMPROD
Ot | SSBRPRD
Al | SSBRPRD
Ge | REGIONPROD

于 2012-10-25T18:09:27.190 に答える