2014-12-19 34 views
1

我正在尝试编写一个简单的脚本,它允许我检查一个目录,并找到任何匹配的文件名。 一旦找到匹配,我只想将curent datetime追加到文件名的前面。powershell v2 - 在一个目录中找到一个文件并重命名它

这听起来很容易,但我不能完全弄清楚

到目前为止,我已经得到了

$directory = "c:\directoryName\" 
$filename = "filename.log" 
$d = Get-Date -format "yyyyMMddHHmm" 

get-childitem -Path $cfg_logDirectory | foreach-object 
{ 
    if ($_.name -eq $cfg_fileName) 
     { 
      $fname = $_.name 
      Rename-Item -NewName $d."_".$fname 
     } 
} 

但是当我运行这个(ISE中至少),我得到一个窗口出现,询问我要

“Cmdlet的的ForEach-对象在命令管道位置2 - 提供值以下参数 :进程[0]”

这是要走的路吗,还是有更好的方法来做到这一点?

回答

4

将您的开口大括号移到上一行的末尾。

get-childitem -Path $cfg_logDirectory | foreach-object { 

你得到错误,因为PowerShell是假设行的结尾是语句的结束,然后再试图提示你缺少的参数的foreach对象 - 在这种情况下,它的脚本块*。将大括号移动到同一行可以告诉Powershell有更多的语句来临。

*为什么'流程'? foreach-object cmdlet可以采用三个脚本块作为参数:BeginProcessEnd。开始和结束是可选的,但是过程是必需的。如果您提供没有名称的脚本块,则假定它是Process。

+0

这就是我以为我很聪明。 。 。欢呼,因为它摆脱了过程[]窗口。重命名项目部分是否正确,因为目前它不重命名该文件。 – IGGt 2014-12-19 11:14:01

+0

您的NewName字符串格式不正确。试试'Rename-Item -NewName“$ d_ $ fname”'。 Powershell中的字符串连接是'+',而不是''',但是您甚至不需要它,因为您可以只评估字符串中的变量。 – 2014-12-19 20:50:41

相关问题