我正在尝试使用 csv 文件中的属性,但我收到一条错误消息,指出 属性 不存在,但它确实存在,我检查了它

I am trying to use properties from a csv file, but I'm receiving an error message that a property doesn't exist, but it does and I checked it

这是我目前的情况:

一个名为 C:\TEMP\AIST2330TP04\SampleEnrollees.csv 的 csv 文件,其中包含以下信息:

OrgDefinedId,Username,LastName,FirstName,Email,Section
1,tuser,User,Test,tuser@mymail.com,AIST2330
2,duser,User,Demo,duser@mymail.com,AIST2330
3,istudent,Student,Ima,istudent@mymail.com,AIST2330
4,ustudent,Student,Ura,ustudent@mymail.com,AIST2330
5,cfarquar,Farquar,Clyde,cfarquar@mymail.com,AIST2330

我的代码是参数化的,获取某些信息并输出文本文件:

#this parameter is a requirement    
param(
[string]$WorkDir = 'C:\Users\cryanderson\Documents'
)
#this is just so that the process can be run multiple times without creating multiple folders and files
Remove-Item 'DemoFiles' -Recurse -ErrorAction Ignore
mkdir 'DemoFiles'
$csv=Import-Csv C:\TEMP\AIST2330TP04\SampleEnrollees.csv
#I want to make sure I am using existing properties, so I display them here
echo $csv
$csv | Get-member -MemberType 'NoteProperty' | Select-Object -ExpandProperty 
'Name'
#The loop that I am having issues with
ForEach($line in $csv)`
{
$username = $_.Username,`
$lastname = $_.LastName,`
$firstname = $_.FirstName,`
$text = "Generated for $firstname $lastname by cryanderson.",`
$text |Out-File 
"C:\Users\cryanderson\Documents\DemoFiles${username}Stuff.txt"
}

当我 运行 它时,发生了以下情况,没有创建任何文件:

PS C:\Users\cryanderson\documents> 
C:\Users\cryanderson\Documents\CreateDemoFiles.ps1


    Directory: C:\Users\cryanderson\documents


Mode                LastWriteTime         Length Name                                                                                                  

----                -------------         ------ ----                                                                                                  

d-----        3/11/2018   8:54 PM                DemoFiles                                                                                             

OrgDefinedId : 1
Username     : tuser
LastName     : User
FirstName    : Test
Email        : tuser@mymail.com
Section      : AIST2330


OrgDefinedId : 2
Username     : duser
LastName     : User
FirstName    : Demo
Email        : duser@mymail.com
Section      : AIST2330


OrgDefinedId : 3
Username     : istudent
LastName     : Student
FirstName    : Ima
Email        : istudent@mymail.com
Section      : AIST2330


OrgDefinedId : 4
Username     : ustudent
LastName     : Student
FirstName    : Ura
Email        : ustudent@mymail.com
Section      : AIST2330


OrgDefinedId : 5
Username     : cfarquar
LastName     : Farquar
FirstName    : Clyde
Email        : cfarquar@mymail.com
Section      : AIST2330

Email
FirstName
LastName
OrgDefinedId
Section
Username

#This error message is repeated for all 5 users listed
The property 'FirstName' cannot be found on this object. Verify that the 
property exists and can be set.
At C:\Users\cryanderson\Documents\CreateDemoFiles.ps1:14 char:14
+ $firstname = $_.FirstName,`
+              ~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : PropertyNotFound

我认为我的 for 循环有问题,但我无法解决。请帮忙?

总的来说,我认为您的问题是使用 $_,这将访问管道中的当前项目,您将其视为循环中的项目。但是,由于您正在分配每个项目 $line in $csv 它没有被放置在管道中,并且在循环中的所有代码中,您应该访问 $line 变量

的属性

编辑:还要记住 ` 正在做什么。增加一个这样的代码会破坏一行代码,并产生一些意想不到的结果

你基本上是说这是一行:

$username = $_.Username, $lastname = $_.LastName, $firstname = $_.FirstName, $text = "Generated for $firstname $lastname by cryanderson.", $text |Out-File "C:\Users\cryanderson\Documents\DemoFiles${username}Stuff.txt"

此外,使用此代码,Out-File 会出现空路径错误,因此我假设您只是解决了该问题。

我相信您获得奇怪的 $username 值的原因是因为代码是一次性执行的,并且在 Out-File 是 运行 之前没有分配变量。所以第一个循环它被分配为 null,第二个循环它将包含先前分配的值。不知道为什么它只会 运行 两次,希望其他人可以回答。