2014-12-19 63 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') } 
相关问题