Powershell(Windows 11)移动文件并重命名

Powershell(Windows 11)移动文件并重命名

我正在尝试编写 PowerShell,以便我清理文件并将它们放入文件夹中,然后重命名它们以在文件名中包含日期,一旦我制定出命令,我就会编写脚本。

但是,当尝试以下操作时,我收到有关无法绑定参数的错误。

由于我是 Powershell 新手,我不确定我做错了什么。我已设法在另一个脚本中使用 get-childitem ... | Rename-Item -NewName.... 命令进行重命名(添加文件名前缀)。

PS T:\Incoming Students\Spring 2024\OTEAS\CF_DATAFILES> $date = '20231114'
PS T:\Incoming Students\Spring 2024\OTEAS\CF_DATAFILES>  get-childitem .\OTE_OTEAS_BARMAP_CHECKSCORE* | Move-Item $_.Name -Destination .\BM_Math_Test_Record_QA\+{$_.Name -replace '.csv', '_'+$date+'.csv'}
Move-Item : Cannot bind argument to parameter 'Path' because it is null.
At line:1 char:59
+ ... -childitem .\OTE_OTEAS_BARMAP_CHECKSCORE* | Move-Item $_.Name -Destin ...
+                                                           ~~~~~~~
    + CategoryInfo          : InvalidData: (:) [Move-Item], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Microsoft.PowerShell.Commands.MoveItemCommand

根据以下反馈,我已将命令修改为以下内容:

foreach ($file in Get-ChildItem BM_Math_Test_Record_QA_* ) {Move-Item -Path $file -Destination ($file.Directory.ToString()+"\BM_Math_Test_Record_QA\"+$file.BaseName.tostring()+"_"+$(get-date -f yyyyMMdd)+$file.Extension) -Verbose} 

并且它似乎正在发挥作用(目前......)

答案1

$_在裸命令中不起作用 – 它仅在循环内定义,例如ForEach-Object。一些 cmdlet 直接将对象列表作为输入,而不执行任何特殊操作,但一旦您想对对象执行自定义操作,就需要一个“foreach”循环:

get-childitem foo | foreach-object { do-something-with $_ }
 -or-
get-childitem foo | % { do-something-with $_ }

foreach ($x in ...)还提供C# 风格的循环。

请注意,{ … }整个“移动”命令将被包装起来,不是只是使用 $_ 的部分。

对于内联字符串连接,你可能需要

".\BM_Math\" + ($_.Name -replace ...)
 -or-
".\BM_Math\$($_.Name -replace ...)"
 -or-
".\BM_Math\$newname"

(后两者可能不需要引号)

答案2

以下是我最终更改命令以使其发挥作用的方法:

foreach ($file in Get-ChildItem BM_Math_Test_Record_QA_* ) 
{Move-Item -Path $file -Destination ($file.Directory.ToString()+"\BM_Math_Test_Record_QA\"+$file.BaseName.tostring()+"_"+$(get-date -f yyyyMMdd)+$file.Extension) -Verbose} 

相关内容