我有一个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
。那么为什么把它放在引号中打印一个数组?
答案 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