Powershell查询- 找不到路径的一部分

3

我正在尝试编写一份PowerShell脚本,从CSV列表中查询电子邮件ID并发送批量个性化电子邮件。 CSV文件和脚本都位于桌面上的同一个文件夹中(\DECSRV02\Folder Redirection\paranjyoti\Desktop\Powershell_massemail)。 脚本包含如下的CSV导入:

$csv = Import-Csv 'C:\Users\paranjyoti\Desktop\Powershell_massemail\UserList.csv'
$Credential = Get-Credential
Foreach($Message in $csv){
$Recipient = $Message.EmailAddress
$FirstName = $Message.FirstName
$LastName = $Message.Surname
$Course = $Message.Course
$Grade = $Message.Grade
$Subject = "$FirstName $LastName - $Course Exam Result"
Write-Host "Sending email to $FirstName $LastName"
Write-Host "Email Address: $Recipient"
$mailBody = 
@"
Hello $FirstName,</br>
We have marked your recent exam and the results are as follows:</br>
</br>
Student Name: $LastName, $FirstName</br>
Course: $Course</br>
Result: $Grade</br>
</br>
Thank you for taking a course at our school,</br>
The Faculty
"@

Send-MailMessage -Body $mailBody -BodyAsHtml `
-From "faculty@greatschool.com" -To $Recipient `
-Subject $subject -Encoding $([System.Text.Encoding]::UTF8) `
-Credential $Credential -SmtpServer "smtp.office365.com" -UseSSLcopy
}

运行脚本时,出现错误:"找不到路径的一部分" 附带的错误消息图像展示在此 请帮忙确认错误原因。


1
请分享脚本中相关部分。 - gmtek
请进一步解释Gulshan的评论; 请告诉我们脚本在哪里调用那个csv文件。此外,您说脚本和文件夹位于同一位置,但是您在图像和帖子中有两个不同的路径。 - TheIdesOfMark
根据您获取的错误,路径 "C:\Users\paranjyoti\Desktop\Powershell_massemail\UserList.csv" 可能不存在,因为您正在将文件夹重定向到桌面的网络路径。我建议您更改所使用的路径为 "\DECSRV02\Folder Redirection\paranjyoti\Desktop\Powershell_massemail\UserList.csv",因为这是您桌面文件夹实际所在的位置。 - CraftyB
谢谢,Theo。我刚刚做了。 - No1
3个回答

4

我遇到了以下错误,尽管它不是上面问题的确切答案,但我会在这里分享给任何遇到类似问题的人。

复制项目:找不到路径的一部分 "D:\projects\changeDetection\cubeRepos\cm-2.0\ConceptMiner2\CM.Spidering.CsSched uleLightweight\csx\Debug\roles\CM.Spidering.CsScheduleLightweight.Worker\approot\Templates\TEST\TEST\REG\TEST--TEST--REG--CACH E-REFRESH\TEST--TEST--REG--CACHE-REFRESH.structure.json".

但我验证了上述文件夹路径存在,并且可以在所需的目录中创建该文件。通过一些搜索,我找到了真正的问题原因。这是因为Windows对于文件路径有一个260个字符的限制。 您会注意到我的路径恰好有260个字符,但是路径长度验证中有一个小细节。路径末尾附加了一个空字符。因此,总共的路径长度变成了261,导致操作失败。

最快的解决方法是重命名文件,使得新文件名的字符数少于260个。有关此错误及扩展路径限制的更多信息,请参见Microsoft文档


0

看起来你需要检查实际路径是否存在?

我遇到了相同的错误,因为我没有文件夹结构:

PS C:\temp\csvimport> .\csvimport.ps1
Import-Csv : Could not find a part of the path 'C:\Users\paranjyoti\Desktop\Powershell_massemail\UserList.csv'.
At C:\temp\csvimport\csvimport.ps1:1 char:8
+ $csv = Import-Csv 'C:\Users\paranjyoti\Desktop\Powershell_massemail\U ...
+        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : OpenError: (:) [Import-Csv], DirectoryNotFoundException
    + FullyQualifiedErrorId : FileOpenFailure,Microsoft.PowerShell.Commands.ImportCsvCommand

但如果它只是找不到文件,那就是另一种错误:

PS C:\temp\csvimport> .\csvimport.ps1
Import-Csv : Could not find file 'C:\userlist.csv'.
At C:\temp\csvimport\csvimport.ps1:1 char:8
+ $csv = Import-Csv 'C:\userlist.csv'
+        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : OpenError: (:) [Import-Csv], FileNotFoundException
    + FullyQualifiedErrorId : FileOpenFailure,Microsoft.PowerShell.Commands.ImportCsvCommand

不确定路径的哪个部分是错误或缺失的。这个练习留给读者自己完成。;)


0
错误显示您的桌面路径已被重定向。 为了获取路径,您可以使用注册表:
$desktop = (Get-ItemProperty -Path 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders').Desktop
$csvPath = Join-Path -Path $desktop -ChildPath 'Powershell_massemail\UserList.csv'
$csv = Import-Csv -Path $csvPath

我可以建议你在使用 Send-MailMessage cmdlet 时也使用Splatting,以摆脱那些讨厌的反引号并使代码更易读:
$mailParams = @{
    Body       = $mailBody
    BodyAsHtml = $true
    Subject    = $subject
    Encoding   = [System.Text.Encoding]::UTF8
    Credential = $Credential
    SmtpServer = 'smtp.office365.com'
    UseSsl     = $true
}

Send-MailMessage @mailParams

希望这有所帮助。

非常感谢。我使用的文件路径是:$csv = Import-Csv -Path .\UserList.csv - No1
1
最好避免在注册表中查找特殊文件夹;我建议使用 [Environment]::GetFolderPath('Desktop')。来自 https://devblogs.microsoft.com/oldnewthing/20031103-00/?p=41973: "现在有些人正在舔着嘴唇说,“哇,这个‘User Shell Folders’键比‘Shell Folders’键还要酷,让我去看看。”我恳求你们保持克制,不要依赖这个新键。只需使用函数 SHGetFolderPath,它返回您想要的任何文件夹的路径。让“用户Shell文件夹”键安息吧。" - mklement0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接