Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell 尝试使用内置的PS1方法获取日期、转换路径、重命名项获取错误_Powershell - Fatal编程技术网

Powershell 尝试使用内置的PS1方法获取日期、转换路径、重命名项获取错误

Powershell 尝试使用内置的PS1方法获取日期、转换路径、重命名项获取错误,powershell,Powershell,我是PowerShell新手,正在尝试编写第一个脚本,将文件从一个目录复制到另一个目录,然后在$DESTINATION目录中的文件复制到那里后重命名它们 我正在从计算机上的C:\Scripts目录执行下面的脚本 第一个foreach循环运行良好,我的文件到达$DESTINATION 但是当我通过第二个循环时,我得到了下面的错误 任何帮助/指导都将不胜感激。谢谢 这是我的密码: # Define variables. $Source = "C:\ETLFILES\WinSCP\FilesETL\*

我是PowerShell新手,正在尝试编写第一个脚本,将文件从一个目录复制到另一个目录,然后在$DESTINATION目录中的文件复制到那里后重命名它们

我正在从计算机上的C:\Scripts目录执行下面的脚本

第一个foreach循环运行良好,我的文件到达$DESTINATION

但是当我通过第二个循环时,我得到了下面的错误

任何帮助/指导都将不胜感激。谢谢

这是我的密码:

# 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