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我的情况如何正确提供建议。

更新(基于以下答案):

我正在寻找一个采用字符串数组的通用实现。它打开了将所有必要的文件/路径放在一个地方的可能性,以便于编辑,以便非 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 回答