2013-02-04 43 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

相關問題