2016-07-07 6 views
1

とアーカイブファイルは、私はすべて一つのディレクトリ内に格納されていると再編成し、アーカイブする必要があるファイル(> 30K)、の膨大な量を持っています。バッチまたはPowerShellの:類似した名前

ファイルが(非時系列的順序)のような名前が付けられています。

  • M056811-01-.txtの
  • M056811-02-.txtの
  • M056811-03-.txtの
  • M956782 -01-.TXT
  • M956782-02-.txtの...

1つのzipファイルに一緒に属している(同じ接頭辞を持つ)ファイルをアーカイブします。これは一種のにつながる:

  • M056811.zip
  • M956782.zip ...

いくつかのバッチまたはPowerShellスクリプトでこれをachiveする方法はあります。

私はスクリプト作成にあまり進んでいません。回答自体(解決策がある場合)を除いて、私は実際にそれが動作することを知りたいと思います。

私の最終的な解決策(デビッド・ブラバントに大きな感謝):

私は、リモートディレクトリの使用のためのスクリプトを編集しました。同じディレクトリ内のスクリプトを配置する必要はありません。最初の2つの変数を編集するだけでよいです。

$dirpath = "<Enter Directorypath here>" 
$offsetlength = 6 

$pathlength = $dirpath.Length 
$absolutelength = $pathlength + $offsetlength 


dir $dirpath | group { $_.FullName.Substring(0, $absolutelength) } | %{ 
    $subset = $_ 

    $subset.Group | %{ 
     Compress-Archive $_ $subset.Name -Update 
    } 
} 
+0

無料のコード作成サービスではありません。あなたのコードが実際に何を達成したいと何を正確に記述し、自分でそれを試してみて、あなたが立ち往生しているとき、ここに戻ってきます。 – aschipfl

答えて

1

に役立ちます参照してここでは、PowerShellでで始めることができるものです。 PowerShell 5(Compress-Archiveコマンドレット用)を使用していることを前提としています。

$dirpath = "D:\temp" 

dir $dirpath | group { $_.Name.Substring(0, 8) } | %{ 
    $subset = $_ 

    $subset.Group | %{ 
     Compress-Archive $_ $subset.Name -Update 
    } 
} 
+0

こんにちはデビッド、ご回答いただきありがとうございます。私はName.Substring(0、8)と仮定最初の8文字で名前をグループ化しますか? PSは次のように応答しますが、理由は何でしょうか?存在しないパスM63251-25-.txt:文字列。 H時:\ツール\ PowerShellの\のGroup_and_Archive.ps1:7文字:9 +圧縮・アーカイブ$ _ $ subset.Name -update + ~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo:InvalidArgument:(M63251-25-.TXT:文字列)[圧縮・アーカイブ]、InvalidOperationExceptionが + FullyQualifiedErrorId:ArchiveCmdletPathNotFound、圧縮・アーカイブ –

+0

自分で間違いを発見しました。スクリプトは、ファイルと同じディレクトリ内にある必要があります。今それは働いている! Davidに感謝します。特定のディレクトリを設定する方法を教えてください。したがって、スクリプトがまったく同じディレクトリにある必要はありませんか?ダビッドありがとう! –

0

あなたはワイルドカードで動作することができます。 「任意の文字」には?、「1つ以上の文字」には*があります。これは「ファイルマスク」と呼ばれ、たとえばM000001-??-.txtです。

dir "M000001-??-.txt" 
dir "M000001*.txt" 
dir "M000001*.*" 

はあなたのジップアプリケーションはおそらくまた、ファイルマスクをサポートしていますので、あなたのような何かを行うことができます(構文は重く、使用されたアプリケーションに依存 - あなたのドキュメントを参照してください):

ZipApp.exe /zip "M000001-??-.txt" "M000001.zip" 

まあが、それはでした簡単な部分。今すぐすべてのファイルを処理してください。簡単なカウンター(for /L)を使用して先行ゼロを追加し、最後の6文字を取り、最後に別の "M"をその前に追加する共通接頭部(M000xxx)があります。これにより、ファイルマスクとZIPファイル名を簡単に構築できます。

@echo off 
setlocal enabledelayedexpansion 
for /l %%i in (1,1,10) do (
    set "n=0000000%%i" 
    set "n=M!n:~-6!" 
    echo Mask="!n!-??-.txt" Zipfile="!n!.zip" 
) 

あなたはforループ内であなたの変数を処理するdelayed expansionを必要としています。

echoの代わりに、正しいパラメータ構文でzipアプリケーションを実行します。(それであなたを助けることができない - それはドキュメントだ参照)

コマンドについて不明な点がある場合は、それがcommand /?(EX for /?set /?。)

+0

はご回答いただきありがとうございます。申し訳ありませんが、私は最初の質問でこれを言及していませんでした。名前は年代順ではありません。もっとM065788-01-.TXT、M065788-02-.TXT .... M0255288-01-.TXT、M0255288-02-.txtのような。お疲れ様でした。 –

関連する問題