2013-10-23 72 views
3

我還在學習Powershell;並意識到它的設計非常簡單。但是,我很尷尬地說,我不能找出一個簡單的方法來使用powershell cmdlet執行下面的dos複製命令(最簡單的方法)。看起來這個複製品不是非常喜歡通配符。我試過的東西最終過於複雜;而且還沒有做到我真正想要的事情。Powershell相當於簡單的DOS命令行:「copy * .ps1 * .ps1.bak/y」

副本* *名爲.psl .ps1.bak/Y

回答

5

內置的複製-Item命令不會執行此操作,但使用一個小腳本獲得所需功能並不困難:

Get-ChildItem *.ps1 | Copy-Item -Dest {"${_}.bak"} 

在這種情況下不需要使用Foreach-Object,因爲Destination參數也接受管道輸入。對於接受管道輸入的參數,我們可以使用scriptblock來計算參數的值。 PowerShell將$_映射到在腳本塊中使用的管道對象,就好像我們在Foreach-Object腳本塊中執行此操作一樣。

+0

我不知道爲什麼,但是當我嘗試了不同的機器上今天這個,我得到了以下錯誤消息。我可以使它工作的唯一方法是將$ _更改爲$ _。name ** Copy-Item:參數'Destination'的腳本塊輸入失敗。方法調用失敗,因爲[System.IO.FileInfo]不包含名爲'op_Addition'的方法。 在線:1 char:39 + Get-ChildItem * .ps1 | Copy-Item -Dest {$ _ +「.bak」} ** – MKANET

+0

是的,它可能是最好的評估字符串中的$ _(見我更新的答案)。 –

1

嗯。我沒有Windows機器方便,但你嘗試過這樣的:

Get-ChildItem *.ps1 | ForEach-Object { 
    Copy-Item $_ "$_.bak" 
} 
0

試試這個:

copy-item -rec -filter *.ps1 C:\Source C:\Dest 

更新:

a = Get-Item .\*.ps1 

foreach($file in $a) 
{ 
    Copy-Item $file.FullName "C:\mydir\$($file.Name.replace(".ps1",".ps1.bak");  
} 
0

基思的解決方案是我最喜歡的,但這裏是我會建議:

foreach ($i in Get-ChildItem *.ps1) { copy $i "$i.bak" }