2013-02-04 45 views
0

我需要复制使用Powershell的一个文件夹的仅某些部分,特别是该列表:XCOPY部署脚本 - 如何包含某些文件?

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

在人类可读的形式:3个的目标文件夹的根特异性MyProgram.*文件和XmlConfig夹这本身就是下的所有XML文件在源路径的根目录下(在我的情况下为..\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

UPDATE(下面的答案基于):

我要寻找一个通用实现这需要一个字符串数组。它可以将所有必要的文件/路径放在一个地方,以便于编辑,这样非Powershell知识丰富的人员可以根据需要理解和修改它。所以最终它将是单个脚本为任何项目执行XCOPY部署,输入文件是唯一可变的部分。对于上面的例子中,输入应该是这样的(保存为input.txt和作为参数传递给主脚本传递):

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

我宁愿通配符的方法,因为没有多少人知道正则表达式。

回答

2

我不知道什么是错的滤镜,但你仍然可以做

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

,如果你想保留directoty结构,你将不得不弱这一点,如:

$sourcedir="c:\temp\test" 
[email protected]("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 
} 
+0

-Filter只需要一个字符串 –

+0

我需要在目标文件夹这个工作。但如果我在目标文件夹中,'.. \ bin \ release'将不起作用。或'$ files'需要指定我不想要的绝对路径。 – Neolisk

+0

这就是你在你的例子中所做的...相对路径和野马也可以用我的代码 –

0

AFAICT - 包含仅适用于文件名或目录名称,而不适用于路径。你可以尝试这样的事情:

$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  
+0

有没有一种方法可以使用一个字符串数组的通用实现?我本来想把所有必要的文件/路径放到一个这里的字符串中(为了便于编辑,它可以用换行符拆分,以适应这个字符串数组的概念),甚至是一个单独的文件, Powershell知识渊博的人可以根据需要理解和修改它。 – Neolisk

+0

当然,这很容易。另一个问题是,如果你想坚持正则表达式模式或更有限的通配符模式?如果你使用正则表达式,那么把每个模式放在一个文件的一行中,并重新构建$文件,如下所示:'$ OFS =“|”; $ files =“$(get-content files.txt)”'。注意:该特定方法不会容忍文件中任何位置的空白行。 –

+0

我更喜欢通配符,没有多少人知道正则表达式。此外,表达式预计不会太复杂以至于不需要正则表达式。我可以确保输入文件遵循一些特定的格式,只要它易于维护。你能举一个通配符的例子吗? – Neolisk

相关问题