【问题标题】: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我正在尝试使用 csv 文件中的属性,但我收到一条错误消息,指出属性不存在,但确实存在,我检查了它
【发布时间】:2018-03-12 01:16:11
【问题描述】:

这是我目前所拥有的:

一个名为 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.FirstName而不是$_.FirstName吗?我希望你得到更多的错误。
  • 添加行有效,但仅适用于其中一行。它创建了 2 个文件,一个名为 Stuff,没有变量信息,另一个与 cfarquarStuff.txt 完美搭配,上面写着“由 cryanderson 为 Clyde Farquar 生成”。所以 t 似乎不是为每一行运行。

标签: powershell csv for-loop import-csv


【解决方案1】:

总的来说,我相信您的问题是使用$_,这将访问管道中的当前项目,您将其视为循环中的项目。但是,由于您分配了每个项目 $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,而第二个循环将具有先前分配的值。不知道为什么它只会运行两次,希望其他人可以回答。

【讨论】:

  • 编辑 $_ 。到 $ 线。工作,但只有其中一条线。它创建了 2 个文件,一个名为 Stuff,没有变量信息,另一个与 cfarquarStuff.txt 完美搭配,上面写着“由 cryanderson 为 Clyde Farquar 生成”。所以它似乎不是每行都运行。
  • 我能问一下你为什么在每行的末尾使用`?这就像在其他一些语言中使用+,或者基本上“下一行代码是这一行的延续”。试着再看看那些
  • 还应该补充一点,如果你想在一行上执行多个命令,正确的分隔符是;
  • 就是这样!所以我使用了转义笔划,因为当我最初编写它时,循环括号内的代码没有被正确包含。删除那些固定的一切。谢谢你们!
猜你喜欢
  • 1970-01-01
  • 2019-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多