0

Powershell を使用してフォルダーの特定の部分、具体的には次のリストのみをコピーする必要があります。

$files = @("MyProgram.exe",
           "MyProgram.exe.config",
           "MyProgram.pdb",
           ".\XmlConfig\*.xml")

人間が読める形式:ターゲットフォルダーのルートの下にある3つの特定のファイルと、ソースパスのルートの下にあるフォルダーMyProgram.*の下のすべてのXMLファイル(私の場合)。フォルダが存在しない場合は、宛先に作成する必要があります。XmlConfig..\bin\Release\XmlConfig

私が試したこと:

(1) 次のことを試しましたが、機能しませんでした。つまり、宛先パスにフォルダーまたはファイルが作成されませんでした。

Copy-Item -Recurse -Path "..\bin\Release\" -Destination ".\Test\" -Include $files

(2)-Includeを削除すると、サブフォルダーとファイルを含むフォルダー構造全体が正常に作成されます。

Copy-Item -Recurse -Path "..\bin\Release\" -Destination ".\Test\"

-Includeフィルターがどのように機能するかについての私の理解には何か問題があるに違いありません:

(3) ワイルドカードの配列が必要な仮定をテストしました-Includeが、これもうまくいきませんでした:

$files = @("*MyProgram.exe*",
           "*MyProgram.exe.config*",
           "*MyProgram.pdb*",
           "*.\XmlConfig\*.xml*")

私の場合、適切に行う方法についてアドバイスしてくださいCopy-Item

更新(以下の回答に基づく):

文字列の配列を取る一般的な実装を探しています。これにより、必要なすべてのファイル/パスを 1 か所にまとめて簡単に編集できるようになり、Powershell の知識のない人でも必要に応じてそれを理解して変更できるようになります。したがって、最終的には、任意のプロジェクトに対して XCOPY 展開を実行する単一のスクリプトになり、入力ファイルが唯一の可変部分になります。上記の例では、入力は次のようになります (input.txtメイン スクリプトに保存され、引数として渡されます)。

MyProgram.exe
MyProgram.exe.config
MyProgram.pdb
.\XmlConfig\*.xml

多くの人が正規表現を知っているわけではないので、ワイルドカードのアプローチを好みます。

4

2 に答える 2

2

フィルターの何が問題なのかわかりませんが、それでもできます

$files | % { copy-item ..\bin\release\$_ -Destination .\test}

ディレクトリ構造を保持したい場合は、次のようにこれを少し弱める必要があります。

$sourcedir="c:\temp\test"
$f=@("existing.txt","hf.csv";"..\dir2\*.txt")
$f |%{
     $source=ls (join-Path $sourcedir $_) |select -expand directoryname    
     if ("$source" -like "$sourcedir*"){
        $destination=$source.Substring($sourcedir.Length)+".\" 
     }
     else{
        $destination=$_
     }  
    copy-item $sourcedir\$_ -Destination $destination -WhatIf
}
于 2013-02-04T17:13:19.150 に答える
0

AFAICT -Include は、ファイル名またはディレクトリ名でのみ機能し、組み合わせ、つまりパスでは機能しません。次のようなことを試すことができます:

$files = 'MyProgram\.exe|MyProgram\.exe\.config|MyProgram\.pdb|XmlConfig\\.*?\.xml'

Get-ChildItem ..\bin\release -r | Where {!$_.PSIsContainer -and ($_.FullName -match $files)} | 
    Copy-Item -Dest .\test

ワイルドカードを使用すると、次のようにできます。

$files = @('*MyProgram.exe','*MyProgram.exe.config','*MyProgram.pdb','*\XmkConfig\*.xml')
Get-ChildItem ..\bin\release -r |
    Foreach {$fn=$_.Fullname;$_} | 
    Where {!$_.PSIsContainer -and ($files | Where {$fn -like $_})} | 
    Copy-Item -Dest .\test    
于 2013-02-04T17:31:03.300 に答える