1. ホーム
  2. powershell

[解決済み] PowerShellコピースクリプトで複数の文字列を適切にフィルタリングする方法

2023-07-06 10:51:48

質問

私は、以下の PowerShell スクリプトを使用しています。 この回答 の PowerShell スクリプトを使用して、ファイル コピーを行っています。問題は、フィルタを使用して複数のファイル タイプを含めたいときに発生します。

Get-ChildItem $originalPath -filter "*.htm"  | `
   foreach{ $targetFile = $htmPath + $_.FullName.SubString($originalPath.Length); ` 
 New-Item -ItemType File -Path $targetFile -Force;  `
 Copy-Item $_.FullName -destination $targetFile }

は夢のようにうまくいきます。しかし、フィルターを使って複数のファイルタイプをインクルードしたいときに問題が発生します。

Get-ChildItem $originalPath ` 
  -filter "*.gif","*.jpg","*.xls*","*.doc*","*.pdf*","*.wav*",".ppt*")  | `
   foreach{ $targetFile = $htmPath + $_.FullName.SubString($originalPath.Length); ` 
 New-Item -ItemType File -Path $targetFile -Force;  `
 Copy-Item $_.FullName -destination $targetFile }

以下のようなエラーが出ます。

Get-ChildItem : Cannot convert 'System.Object[]' to the type 'System.String' required by parameter 'Filter'. Specified method is not supported.
At F:\data\foo\CGM.ps1:121 char:36
+ Get-ChildItem $originalPath -filter <<<<  "*.gif","*.jpg","*.xls*","*.doc*","*.pdf*","*.wav*",".ppt*" | `
    + CategoryInfo          : InvalidArgument: (:) [Get-ChildItem], ParameterBindingException
    + FullyQualifiedErrorId : CannotConvertArgument,Microsoft.PowerShell.Commands.GetChildItemCommand

括弧がない、様々な反復がありますね。 -filter , -include のように、インクルードを変数として定義します(例. $fileFilter のように)、毎回上記のようなエラーが発生し、常に次のようなものを指しています。 -filter .

興味深い例外は、私がコード -filter "*.gif,*.jpg,*.xls*,*.doc*,*.pdf*,*.wav*,*.ppt*" . エラーはないのですが、結果が出ず、コンソールにも何も戻ってきません。私は、うっかりと暗黙の and をコーディングしてしまったのでしょうか?

では、私は何が間違っていて、どう修正すればいいのでしょうか?

どのように解決するのですか?

-フィルタ は単一の文字列しか受け付けません。 -インクルード は複数の値を受け付けますが -パス 引数を指定します。トリックは \* をパスの末尾に追加し、その後に -Include で複数の拡張子を選択します。ちなみに、コマンドレットの引数には、スペースやシェル特殊文字が含まれていない限り、文字列のクオートは不要です。

Get-ChildItem $originalPath\* -Include *.gif, *.jpg, *.xls*, *.doc*, *.pdf*, *.wav*, .ppt*

これは $originalPath がバックスラッシュで終わっているかどうかに関係なく動作することに注意してください。なぜなら、複数の連続したバックスラッシュは一つのパスセパレータとして解釈されるからです。例えば、試してみてください。

Get-ChildItem C:\\\\\Windows