PowerShell变量从文件打印所有csv列

时间:2017-10-23 15:25:02

标签: powershell import-csv

我有一个csv文件:

"SamAccountName","UserPrincipalName","Telephonenumber"
"TUser","TUser@domain.com","+15551112222"

我遍历文件:

$csvfile = Import-Csv $path
foreach ($row in $csvfile) {
    Write-Host $row.SamAccountName, "$row.SamAccountName"
}

第一个$row.SamAccountName打印csv文件中的sam帐户名字符串。如果我将相同的变量放在引号中,它会打印一个数组。我的输出如下:

TUser @{SamAccountName=TUser; UserPrincipalName=TUser@domain.com; Telephonenumber=+15551112222}.SamAccountName

如果我在.GetType()$row.SamAccountName说{a} System.String。那么为什么把它放在引号中打印一个数组?

3 个答案:

答案 0 :(得分:1)

它不打印数组,它打印对象的文本解释。

如果要在字符串中插入对象属性,则需要使用语法"$($object.property)"。如此改变将起作用:

$csvfile = Import-Csv $path
foreach ($row in $csvfile) {
    Write-Host $row.SamAccountName, "$($row.SamAccountName)"
}

或使用格式字符串运算符:

$csvfile = Import-Csv $path
foreach ($row in $csvfile) {
    "{0}" -f $row.SamAccountName
}

答案 1 :(得分:1)

当你这样写时:

$row

只有$row被识别为变量的一部分,因为.ToString()是一个数组,它输出的是什么。如果你想将整个事情写成一个字符串,请尝试查看"$($row.SamAccountName)" 或将原始语句包装成如下变量:

    // MPU-6050 Short Example Sketch
    // By Arduino User JohnChi
    // August 17, 2014
    // Public Domain
#include<Wire.h>
extern TwoWire Wire1;
const int MPU_addr=0x68;  // I2C address of the MPU-6050
int16_t AcX,AcY,AcZ,Tmp,GyX,GyY,GyZ;
int minVal=265;
int maxVal=402;
double x;
double y;
double z;
double pitch,roll,delta_X,delta_Y,delta_Z;
double old_AcX=0;
double old_AcY=0;
double old_AcZ=0;
int led = 13;

void setup(){
  Wire1.begin();
  Wire1.beginTransmission(MPU_addr);
  Wire1.write(0x6B);  // PWR_MGMT_1 register
  Wire1.write(0);     // set to zero (wakes up the MPU-6050)
  Wire1.endTransmission(true);
  Serial.begin(9600);
  pinMode(led, OUTPUT);
 }
 void loop(){
  Wire1.beginTransmission(MPU_addr);
  Wire1.write(0x3B);  // starting with register 0x3B (ACCEL_XOUT_H)
  Wire1.endTransmission(false);
  Wire1.requestFrom(MPU_addr,14,true);  // request a total of 14        registers
  AcX=Wire1.read()<<8|Wire1.read();  // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L)    
  AcY=Wire1.read()<<8|Wire1.read();  // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)
  AcZ=Wire1.read()<<8|Wire1.read();  // 0x3F (ACCEL_ZOUT_H) & 0x40 (ACCEL_ZOUT_L)
  Tmp=Wire1.read()<<8|Wire1.read();  // 0x41 (TEMP_OUT_H) & 0x42 (TEMP_OUT_L)
  GyX=Wire1.read()<<8|Wire1.read();  // 0x43 (GYRO_XOUT_H) & 0x44 (GYRO_XOUT_L)
  GyY=Wire1.read()<<8|Wire1.read();  // 0x45 (GYRO_YOUT_H) & 0x46 (GYRO_YOUT_L)
  GyZ=Wire1.read()<<8|Wire1.read();  // 0x47 (GYRO_ZOUT_H) & 0x48 (GYRO_ZOUT_L)
  Serial.print("AcX = "); Serial.print(AcX);
  Serial.print(" | AcY = "); Serial.print(AcY);
  Serial.print(" | AcZ = "); Serial.print(AcZ);
  Serial.print(" | Tmp = "); Serial.print(Tmp/340.00+36.53);     //equation for temperature in degrees C from datasheet
  Serial.print(" | GyX = "); Serial.print(GyX);
  Serial.print(" | GyY = "); Serial.print(GyY);
  Serial.print(" | GyZ = "); Serial.println(GyZ);



  delay(1000);
 }

这样它就会考虑变量的所有部分。

答案 2 :(得分:0)

在&#34; $ row.SamAccountName&#34;周围使用双引号你告诉PowerShell要从那行打印IE行的对象数组。正如我们从您的输出中看到的那样:

TUser @{SamAccountName=TUser; UserPrincipalName=TUser@domain.com; Telephonenumber=+15551112222}.SamAccountName

这是您的Write-Host声明。首先,您正在编写$ row.SamAccountName,其次您要添加整个Row对象,即Array。双引号中的.SamAccountName被视为文字字符串,因此,它不访问该行以检索其值。

如果您只是将$ row放在双引号中,您将得到:

@{SamAccountName=TUser; UserPrincipalName=TUser@domain.com; Telephonenumber=+15551112222}

如果要在变量周围使用双引号,请在尝试访问子表达式时使用此引号。

"$($row.SamAccountName)"

这是subExpression表单。

以下链接有助于了解转义符和字符串连接。 https://ss64.com/ps/syntax-esc.html