我正在尝试编写 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}