我正在尝试使用通配符创建一个脚本来重命名与给定文件名匹配的文件。 e.g。
我有一个包含以下文件的文件夹:
我想浏览此文件夹,并将当前时间追加到以“filename”开头的任何文件的开头
到目前为止,我有以下内容:
$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
但它不起作用。 正如我所看到的,各个部分“应该”在我阅读文档时起作用,但显然有些不对劲。如果有人能够指出它,我们将不胜感激。
我们越来越近了。看来-path
部分中的rename-item
需要$dir$_
,因为$_
(貌似)只包含文件名。 (get-help示例表明它需要是完整路径和文件名)
如果我取出rename-item部分并将其替换为%{write-host $d"_"$_}
,则会提供正确的新文件名
但是,将其放入rename-item
部分仍然不会更新文件名。
rename-item -path $dir$_ -newname $d"_"$_
SUCCESS
正确的语法似乎是:
get-childitem -Path "$dir" | where-object { $_.Name -like "$file" } | %{rename-item -path $dir$_ -newname $d"_"$_}
缺少的元素是%{ ... }
部分周围的rename-item
,这使我能够引用$_
答案 0 :(得分:2)
我不记得.
是PowerShell中的字符串连接运算符(我可能错了)。试试这个:
rename-item -path $_ -newname "$d_$($_.name)"
或者这个
rename-item -path $_ -newname ($d + "_" + $_.name)
甚至是这个
rename-item -path $_ -newname ({0}_{1} -f $d,$_.name)
查看答案here
答案 1 :(得分: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)" }
这应该有效,假设错误与“无法将参数绑定到参数'Path'”和NewName字符串有关。
问题包括:
您可以,而不是将管道对象传递给Foreach-Object
,而不是直接传递给Rename-Item
- 但我不确定如何引用{{1}的对象名称参数。
答案 2 :(得分:0)
另一种方法是不使用foreach或%,而是使用脚本块:
get-childitem -Path "$dir" -filter $file | rename-item -newname { $d + "_" + $_.name }
请参阅doc for rename-item中的示例: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') }