Powershell 尝试使用内置的PS1方法获取日期、转换路径、重命名项获取错误
我是PowerShell新手,正在尝试编写第一个脚本,将文件从一个目录复制到另一个目录,然后在$DESTINATION目录中的文件复制到那里后重命名它们 我正在从计算机上的C:\Scripts目录执行下面的脚本 第一个foreach循环运行良好,我的文件到达$DESTINATION 但是当我通过第二个循环时,我得到了下面的错误 任何帮助/指导都将不胜感激。谢谢 这是我的密码:Powershell 尝试使用内置的PS1方法获取日期、转换路径、重命名项获取错误,powershell,Powershell,我是PowerShell新手,正在尝试编写第一个脚本,将文件从一个目录复制到另一个目录,然后在$DESTINATION目录中的文件复制到那里后重命名它们 我正在从计算机上的C:\Scripts目录执行下面的脚本 第一个foreach循环运行良好,我的文件到达$DESTINATION 但是当我通过第二个循环时,我得到了下面的错误 任何帮助/指导都将不胜感激。谢谢 这是我的密码: # Define variables. $Source = "C:\ETLFILES\WinSCP\FilesETL\*
# Define variables.
$Source = "C:\ETLFILES\WinSCP\FilesETL\*.*"
$Destination = "C:\ETLFILES\WinSCP\SFE_Archive\"
$DestinationFiles = "C:\ETLFILES\WinSCP\SFE_Archive\*.*"
# Create the $sourceFileList variable to loop through
$sourceFileList = Get-ChildItem -path $Source
# Loop through the $soureFileList and copy the items to the $Destination.
foreach ($item in $sourceFileList) {
Copy-Item -Path $Source -Destination $Destination
}
# Create the $destinationFileList variable to loop through
$destinationFileList = Get-ChildItem -path $DestinationFiles
# Loop through the $destinationFileList and rename the files with appended DateTime stamp.
foreach ($itemDest in $destinationFileList) {
$Date = (Get-Date).ToString("yyyyMMdd_HHmmss")
$newFileName = $Date + "_" + $itemDest
Rename-Item $itemDest $newFileName
}
下面是我遇到的错误,我认为我需要更改-路径,因为它要查看脚本的执行位置,而不是像上面查看$Source那样查看$DestinationFiles目录:
PS C:\Scripts>C:\Scripts\ArchiveSFE\u files.ps1
重命名项:无法重命名指定的目标,因为它表示路径或设备名。
在C:\Scripts\ArchiveSFE\u files.ps1:21 char:5
+重命名项$itemDest$newFileName
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+CategoryInfo:InvalidArgument:(:)[重命名项],pArgumentException
+FullyQualifiedErrorId:参数,Microsoft.PowerShell.Commands.RenameItemCommand
重命名项:无法重命名指定的目标,因为它表示路径或设备名。
在C:\Scripts\ArchiveSFE\u files.ps1:21 char:5
+重命名项$itemDest$newFileName
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+CategoryInfo:InvalidArgument:(:)[重命名项],pArgumentException
+FullyQualifiedErrorId:参数,Microsoft.PowerShell.Commands.RenameItemCommand
重命名项:无法重命名指定的目标,因为它表示路径或设备名。
在C:\Scripts\ArchiveSFE\u files.ps1:21 char:5
+重命名项$itemDest$newFileName
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+CategoryInfo:InvalidArgument:(:)[重命名项],pArgumentException
+FullyQualifiedErrorId:参数,Microsoft.PowerShell.Commands.RenameItemCommand
重命名项:无法重命名指定的目标,因为它表示路径或设备名。
在C:\Scripts\ArchiveSFE\u files.ps1:21 char:5
+重命名项$itemDest$newFileName
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+CategoryInfo:InvalidArgument:(:)[重命名项],pArgumentException
+FullyQualifiedErrorId:参数,Microsoft.PowerShell.Commands.RenameItemCommand
PS C:\Scripts>我不是一个赌徒,但我敢打赌你犯的错误就是这个
Get-Date : Cannot bind parameter 'Date'. Cannot convert value "+" to type "System.DateTime".
Error: "String was not recognized as a valid DateTime."
这是因为这里的代码试图向PowerShell DateTime对象添加一个字符,而这根本无法运行。但是,您可以选择单个属性并将字符连接到该属性上
但是,我注意到您注释掉了代码中的一些行,我猜您希望以这种格式获取日期:“yyyyMMdd HHmmss”
如果是这样的话,这个小片段可以帮你做到这一点:
# Define logic to rename and copy .
foreach ($item in $sourceFileList) {
$newFileName = $(Get-Date -UFormat %Y%m%d-%H%m%S) + "_" + $item
"the item $($item.BaseName) would become $newFileName"
}
这将向屏幕输出文件的新名称,如下所示:
项目q1将成为20160921-110907_q1.png
项目q2将成为20160921-110907_q2.png
项目q3将成为20160921-110907_q3.png
一旦你对新名字感到满意,你就可以把这句话注释掉。最好的部分是什么?只需将此代码放在当前$newFileName
行的代码中,它就可以与以前的代码一起使用
如果我错了,请告诉我您遇到的错误,我将帮助您解决此问题。如果您习惯于基于文本的语言和工具,PowerShell可能会有点棘手,因为PowerShell中的所有内容都是.NET对象 这一行:
$newFileName = Get-Date + "_" + $item # .ToString("yyyyMMdd-HHmmss") + "_" + $item
肯定会导致错误<代码>获取日期返回一个[datetime]
对象。虽然
[datetime]
确实支持+
运算符,但它需要类型为[timespan]
的参数,并且字符串“\uquo
无法转换为timespan
您需要的是一个表示当前日期的字符串。使用注释掉的ToString()
语句,或使用-Format
参数生成格式化字符串,而不是[datetime]
对象:
$newFileName = (Get-Date).ToString("yyyyMMdd-HHmmss") + "_" + $item
或
当您尝试重命名为$newFileName时,您似乎正在尝试在Get Date的时间部分使用:编写一个文件。这将消除一个错误
$Date = Get-Date.ToString("yyyyMMdd_HHmmss")
$newFileName = $Date + "_" + $item
包括上述内容,这将防止出现该问题 感谢大家的帮助和投入。我真的很感激。我终于能够解决我的问题,即在foreach循环中指定的变量中定义了完整路径,这就是产生上述错误的原因。一旦我使用了.NAME属性,问题就解决了。再次感谢大家 你会犯什么错误?您的powershell版本是什么?很抱歉没有复制错误。我正在修改代码并试图简化。我将编辑上面的代码,并在下面输入新的错误。感谢您的快速响应。我正在使用PS 4.0版,尝试将您的“\”放在声明中两条路径的末尾。更好的样式并可能有助于解决问题…谢谢,我将进行更改。谢谢帮助。如何确保在目标路径中重命名文件?我想我必须先使用CONVERT-PATH,然后再使用RENAME-ITEM方法。你也可以动态查看重命名。不要在复制后循环遍历文件夹,而是将新名称构建到复制项中,使其作为新文件名复制。谢谢Bob。谢谢你的帮助。
$Date = Get-Date.ToString("yyyyMMdd_HHmmss")
$newFileName = $Date + "_" + $item