2014-12-19 68 views
0

我試圖創建一個腳本來重命名指定的文件名匹配的文件,用通配符,字符串匹配的文件。例如的PowerShell V2 - 重命名其名稱包含通配符

我有一個包含文件夾中的以下文件:

  • 201412180900_filename_123.log
  • 201412181000_filename_123.log
  • 201412181100_filename_456.log
  • filename_789.log

我要掃描通過該文件夾,並將當前時間附加到以wor開頭的任何文件的開頭d '文件名'

我見到目前爲止以下內容:

$d = Get-Date -format "yyyyMMddHHmm" 
$dir = "C:\test" 
$file = "filename*.log" 

get-childitem -Path "$dir" | where-object { $_.Name -like "$file" } | rename-item -path $_ -newname $d."_".$_.name 

,但它不工作。 當我看到它的各個部分「應當」的工作從我的文檔閱讀,但很明顯,什麼是錯的。如果有人能指出它,將不勝感激。


我們越來越近了。這樣看來,-pathrename-item部分必須$dir$_$_(貌似)只包含文件名。 (一開始幫助例子表明它需要的完整路徑和文件名),如果我參加了命名項部分,並與%{write-host $d"_"$_}取代它,它提供了正確的新文件名

然而,簡單地把這個

rename-item部分仍然不更新文件名。

rename-item -path $dir$_ -newname $d"_"$_ 

成功

正確的語法似乎是:

get-childitem -Path "$dir" | where-object { $_.Name -like "$file" } | %{rename-item -path $dir$_ -newname $d"_"$_} 

缺少的元素是在%{ ... }圍繞rename-item部分,這使我引用$_

+1

當你運行它時會發生什麼*如果我可能會問? – 2014-12-19 12:04:04

+0

「它不起作用」對嘗試幫助你沒有用處。描述發生了什麼以及你期望發生什麼。 – alroc 2014-12-19 12:06:24

+0

對不起,我應該更清楚一點,基本上當我運行它時,什麼都不會發生。沒有錯誤信息。但文件名不會改變。我期望發生的事情是要麼得到一個錯誤消息,要麼文件名應該改變。 – IGGt 2014-12-19 13:14:23

回答

2
$d = Get-Date -format "yyyyMMddHHmm" 
$dir = "C:\test" 
$file = "filename*.log" 

get-childitem -Path $dir | where-object { $_.Name -like $file } | %{ rename-item -LiteralPath $_.FullName -NewName "$d`_$($_.name)" } 

這應該工作,假設該錯誤是關於到「可以不將參數綁定到參數'路徑'「和NewName字符串。

的問題包括:

,你可以,而不是傳遞管道對象爲Foreach-Object,直接傳遞給Rename-Item - 但我不確定如何引用-NewName參數的對象名稱。

+1

也可以使用'GCI -Path $ dir -Filter $ file'而不是Where-Object,但我懷疑這是PoSHv3 +。 – 2014-12-19 12:29:45

+0

歡呼有關$ _在foreach循環,但仍然沒有喜悅 – IGGt 2014-12-19 13:40:33

+0

歡呼聲好點,你的例子最終讓我在那裏,用'%{...}'爲了使用'$ _'外一個'foreach'循環 – IGGt 2014-12-19 14:16:09

2

我不記得.是在PowerShell中的字符串連接符(我可能是錯的)。試試這個:

rename-item -path $_ -newname "$d_$($_.name)" 

或者這

rename-item -path $_ -newname ($d + "_" + $_.name) 

甚至這個

rename-item -path $_ -newname ({0}_{1} -f $d,$_.name) 

查看答案here

+0

剛纔有一點實驗,''$ d _ $($ _。name)''試圖獲得'$ d_ + $($ _。name)''。我試圖通過添加「'」來解決這個問題 - 但對於更好的方法會感到好奇。你說'。'是對的。 – 2014-12-19 12:25:51

+0

歡呼聲,我嘗試了+,但沒有奏效,但沒有某種連接操作符,它看起來不正確。我以爲我已經閱讀過關於使用。加入字符串(顯然我沒有)。不幸的是,上述選項都沒有奏效。前兩個沒有做任何事情(沒有更新文件名),最後一個給出了各種'意外標記'錯誤。 – IGGt 2014-12-19 13:25:38

0

另一種方式做到這一點,而不使用的foreach或%,但一個腳本塊來代替:

get-childitem -Path "$dir" -filter $file | rename-item -newname { $d + "_" + $_.name } 

見的例子在文檔的重命名項:https://msdn.microsoft.com/en-us/powershell/reference/3.0/microsoft.powershell.management/rename-item有一個-replace運算太多,但它不能使用通配符?哦,你不需要通配符:

get-childitem -Path "$dir" -filter $file | rename-item -newname { $_.name -replace 'filename',($d + '_filename') } 
相關問題