1

我一直在编写 Powershell 中的脚本,以从 CSV 文件中获取路径,并将相应路径中的这些文件移动到其他地方的新目的地。通常使用不同的文件名。

我正在使用 5.0 版

例如:

Source Destination : C:\1\2\3\File.pdf, D:\3\7\8\9\FILE1.pdf

现在我使用了以下脚本,它最初能够移动一些文件:

Import-CSV "R:\MoveFiles.csv" -Delimiter "," -ErrorAction Stop | ForEach-Object{Move-Item  -path $_.Source -Destination $_.Destination}

尽管执行到一半左右开始返回此错误:

移动项目:找不到路径的一部分。在 line:1 char:238 + ... Each-Object{Move-Item -Literalpath $ .Source -Destination $ .Destina ...
+ ~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : WriteError: (Q:\RECORDS\ PRIV...-4-20_N1969.pdf:FileInfo) [Move-Item], DirectoryNotFoundException
+ FullyQualifiedErrorId : MoveFileInfoItemIOError,Microsoft.PowerShell.Commands.MoveItemCommand

据我所知,没有特殊字符会阻止找到路径。如果我将 Move-Item 替换为 Copy-Item 它会返回相同的错误。我还检查了路径以查看它们是否正确。

我对此束手无策。不知道还有什么可以尝试的。我毕竟是一个完全的新手。

谢谢

注意:我为这个问题制定了解决方案。Move-Item cmdlet似乎不喜欢创建目录。

相反,我首先使用New-Item -directories创建目录,从文本文档中获取内容,其中每一行都代表一个路径(没有标题)。

首先创建空目录后,原始脚本按预期工作。

对于这里感兴趣的任何人是目录脚本:

 #CREATE DIRECTORIES FROM CSV

cd 

$name = Get-Content ".\Create_New_Directories\Move_Directories_Test.txt"
Foreach ($_ in $name)
{
    New-Item -Force -verbose -path $_ -Type Directory
} 

Out-File ".\Create_New_Directories\Newoutput.txt"

感谢大家的帮助。

4

2 回答 2

0

要调试这种情况,请考虑Move-Item's-WhatIf参数。像这样,

... | ForEach-Object{Move-Item -whatif  -path $_.Source -Destination $_.Destination}

这将打印预期的操作,因此您可以仔细检查任何诡计的路径。

如果:对目标“项目:C:\Temp\SomeFile.xml 目标:C:\Temp\Somewhere\SomeFile.xml”执行“移动文件”操作。

于 2018-03-15T07:52:28.857 回答
0

没有把握。但是您的错误消息表明这是 DirectoryNotFound 的写入错误。所以也许你应该确保你在目标端有烫发并且不超过路径长度的任何字符限制。

其他一些需要考虑/尝试的事情:

您的 CSV 文件应采用以下格式(第一行必须是标题):

Source,Destination
C:\1\2\3\SomeFile.pdf,D:\1\2\3\SomeFile.pdf
C:\1\2\3\SomeFile2.pdf,D:\1\2\3\SomeFile2.pdf

此外,您没有对输入进行消毒,因此如果您在 Excel 中制作 CSV 文件,您可能会有前导或尾随空格。在这种情况下,要么清理记事本中的文件编辑,要么$_.Source.trim()尝试$_.Destination.trim()

就像另一个人说的那样,-whatif 开关很有用,-verbose 也是如此。

您也可以尝试 Move-Item -Force 和/或以管理员身份打开 powershell。

祝你好运!;-)

于 2018-03-15T08:44:06.043 回答