tech.guitarrapc.cóm

Technical updates

PowerShell でディレクトリ構造を保ったまま特定のファイルをコピーする (2)

前回の続きです。

今回は、コメントをいただいた箇所を対応してみましょう。

最後の二つ、比較がフェアではないですな…。

つまり

ヴァニシング・あえとす (@aetos382) August 13, 2014

ご指摘の通りです。 基本的には、文字列での差し替えはあまり好みでなかったのでてけとーに比較対象としました

Copy-StrictedFilterFileWithDirectoryStructure.ps1

は、パスをコピーしてから、いらないものを削除のためディレクトリを何度も舐めています。 単純にフィルタの有無の問題ではないよね。ということで、対応しましょう。

対応

単純に、2つ目のCopy-StrictedFilterFileWithDirectoryStructure.ps1と同様のフィルタを1つ目のCopy-StrictItemWithDirectoryStructure.ps1に組むだけです。簡単です。

適当に実装してみましょう。

利用方法

PowerShellで一番使うのはHelpです。

PS> help Copy-ItemEX -Full
NAME
    Copy-ItemEX

SYNTAX
    Copy-ItemEX [-Path] <string> [-Destination] <string> [[-Targets] <string[]>] [[-Excludes] <string[]>] [[-Recurse]]
     [[-Force]] [[-WhatIf]]  [<CommonParameters>]


PARAMETERS
    -Destination <string>

        Required?                    true
        Position?                    1
        Accept pipeline input?       true (ByPropertyName)
        Parameter set name           (All)
        Aliases                      None
        Dynamic?                     false

    -Excludes <string[]>

        Required?                    false
        Position?                    3
        Accept pipeline input?       true (ByPropertyName)
        Parameter set name           (All)
        Aliases                      None
        Dynamic?                     false

    -Force

        Required?                    false
        Position?                    5
        Accept pipeline input?       false
        Parameter set name           (All)
        Aliases                      None
        Dynamic?                     false

    -Path <string>

        Required?                    true
        Position?                    0
        Accept pipeline input?       true (ByValue, ByPropertyName)
        Parameter set name           (All)
        Aliases                      PSParentPath
        Dynamic?                     false

    -Recurse

        Required?                    false
        Position?                    4
        Accept pipeline input?       true (ByPropertyName)
        Parameter set name           (All)
        Aliases                      None
        Dynamic?                     false

    -Targets <string[]>

        Required?                    false
        Position?                    2
        Accept pipeline input?       true (ByPropertyName)
        Parameter set name           (All)
        Aliases                      None
        Dynamic?                     false

    -WhatIf

        Required?                    false
        Position?                    6
        Accept pipeline input?       false
        Parameter set name           (All)
        Aliases                      None
        Dynamic?                     false

    <CommonParameters>
        This cmdlet supports the common parameters: Verbose, Debug,
        ErrorAction, ErrorVariable, WarningAction, WarningVariable,
        OutBuffer, PipelineVariable, and OutVariable. For more information, see
        about_CommonParameters (https://go.microsoft.com/fwlink/?LinkID=113216).


INPUTS
    System.String
    System.String[]
    System.Management.Automation.SwitchParameter


OUTPUTS
    System.Object

ALIASES
    None


REMARKS
    None

基本的な利用方法

前回の2番目に紹介したCopy-StrictedFilterFileWithDirectoryStructure.ps1と同じように利用できます。

例えば、 c:\valentia\valentia\Toolsから.ps1がつくファイル(と、そのディレクトリ構造)だけc:\hogeにコピーするならそのままこうです。

Targetsはファイル名で指定できるので、ワイルドカード*も使えますよ?

Copy-ItemEX -Path c:\valentia\valentia\Tools -Destination C:\hoge -Targets *.ps1

デフォルトでは、コピーするか確認されます。

image

Yesを選択すると、そのファイルだけコピーされて、他のファイルでもまた聞かれます。

Yes to Allを選択すると、以降のファイルも含めてすべて確認ダイアログが出ずにコピーされます。

NoやNo to AllはYesの逆です。

もし該当フォルダに対象のファイルがなければエラーになります。

image

確認ダイアログを省略する

確認ダイアログを出さずに一気にコピーしたい場合は、 -Forceスイッチを付けてください。

Copy-ItemEX -Path c:\valentia\valentia\Tools -Destination C:\hoge -Targets *.ps1 -Force

対象フォルダのディレクトリツリーを舐めてコピーする

また、 c:\valentiaのフォルダから奥の階層もそのまま取得するなら-Recurseスイッチを付けてください。

Copy-ItemEX -Path c:\valentia -Destination C:\hoge -Targets *.ps1 -Recurse

コピーを実行せずどうなるかだけ確認する

もし、コピーせずにどうなるかを試すなら-WhatIfを使います。もちろん-Recurseとも併用できます。

Copy-ItemEX -Path c:\valentia -Destination C:\hoge -Targets *.ps1 -Recurse -WhatIf

特定のファイルを除く

例えば、*.ps1をコピーするが、install.ps1は除外なら-Excludesに指定しています。

Copy-ItemEX -Path c:\valentia -Destination C:\hoge -Targets *.ps1 -Excludes install.ps1 -Recurse

はい、簡単。ファイル名で指定できるので、ワイルドカード`*も使えます。

パイプライン入力への対応

対応しています。

内容

説明するまでもない簡単なコードです。

process{} 節で必要な処理がされています。

  1. 必要なファイルのフィルタ
  2. いらないファイルの除去
  3. コピーに実施

以上です。基本的には、[I/O.FileInfo]と[I/O.DicretoryInfo]のみに対応しているので他のプロバイダはシリマセン。

まとめ

Tuple可愛いよTuple。