前回の続きです。
今回は、コメントをいただいた箇所を対応してみましょう。
最後の二つ、比較がフェアではないですな…。
目次
つまり
@guitarrapc 対象のファイルをどの時点で絞るかではなく、単に $Path が [string[]] か [string] かということに起因する差であって、先に絞るやり方でも後のと同じインターフェイスにすることは可能ですよね? と思って。
— ヴァニシング・あえとす (@aetos382) August 13, 2014
ひぁ。ご指摘の通りです。単純にパスの差し替えを嫌ったのですが、何も返す言葉もありません。
基本的には、文字列での差し替えはあまり好みでなかったのでてけとーに比較対象にしましたが、
は、パスをコピーしてから、いらないものを削除のためディレクトリを何度も舐めています。気持ち悪い。
単純にフィルタの有無の問題ではないよね。ということで、対応しましょう。
対応
単純に、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 (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
デフォルトでは、コピーするか確認されます。
Yes を選択すると、そのファイルだけコピーされて、他のファイルでもまた聞かれます。
Yes to All を選択すると、以降のファイルも含めてすべて確認ダイアログが出ずにコピーされます。
No や No to All は Yesの逆です。
もし該当フォルダに対象のファイルがなければエラーになります。
確認ダイアログを省略する
確認ダイアログを出さずに一気にコピーしたい場合は、 -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{} 節で必要な処理がされています。
- 必要なファイルのフィルタ
- いらないファイルの除去
- コピーに実施
以上です。基本的には、[IO.FileInfo] と [IO.DicretoryInfo] のみに対応しているので 他のプロバイダはシリマセン。
まとめ
Tuple可愛いよ Tuple。