読者です 読者をやめる 読者になる 読者になる

tech.guitarrapc.cóm

C#, PowerShell, Unity, Cloud, Serverless Technical Update and Features

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

前回の続きです。

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

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

目次

つまり

ひぁ。ご指摘の通りです。単純にパスの差し替えを嫌ったのですが、何も返す言葉もありません。

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

は、パスをコピーしてから、いらないものを削除のためディレクトリを何度も舐めています。気持ち悪い。

単純にフィルタの有無の問題ではないよね。ということで、対応しましょう。

対応

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

コード

てけとーに実装してみましょう。

利用方法

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

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 (http://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

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

f:id:guitarrapc_tech:20140819011719p:plain

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

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

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

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

f:id:guitarrapc_tech:20140819012100p:plain

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

確認ダイアログを出さずに一気にコピーしたい場合は、 -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. コピーに実施

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

まとめ

Tuple可愛いよ Tuple。