2015-09-16 25 views
0

我試圖讀出一個CSV文件,其中包含用戶名,名稱,姓氏和某些用戶的性別。該腳本應讀出用戶ID並檢查具有此ID的目錄是否已存在,如果不存在,則創建一個。比它應該讀出,用戶具有哪種性別。有了這些信息,腳本就會生成一個文本文件,其中包含適當的稱呼和靜態文本,對男性和女性來說都是一樣的。這是我迄今完成:出現在文本文件中的新行不應該是

#Variables 

$script:pgm="welcome" 
$script:log="$PSScriptRoot\$pgm.log"   
$script:csv="$pgm.csv" 
$script:dir="D:\ps\users" 
$script:txt="$pgm.txt" 
$script:fix="$pgm.fix" # fix is the file with the static text 
$script:mrs="Dear Mrs." 
$script:mr="Dear Mr." 

# Create directories & textfiles 

$imp=import-csv $csv -Delimiter ";" -Encoding UTF8 
$users=$imp[0..2].Userid 
$sex=$imp[0..2].Sex 
$sirname=$imp[0..2].SirName 
$f=cat $fix 

foreach($a in $users) { 
    if(! (Test-Path $dir\$a)) { 
     New-Item -Path $dir\$a -ItemType Directory  
    } 
} 
foreach($d in $sex) { 
    if ($d -eq "F") { 
     foreach($name in $sirname) { 
      write-output $mrs $name"," | out-file $dir\$a\$txt 
     } 
    } 
    Else { 
     foreach($name in $sirname) { 
      write-output $mr $name"," | out-file $dir\$a\$txt 
     } 
    } 
    write-output $f >> $dir\$a\$txt 
} 

我有兩個鬥爭:

  1. 腳本總是寫「瓊斯」作爲文本文件名,而忽略其他兩個也只寫'尊敬的先生。' (也對女性用戶)。
  2. 該腳本將名稱放在單獨的行中。 Write-Host -NoNewLine適用於此問題,但僅在控制檯中,您無法將其轉換爲文件。有沒有辦法用write-output來做到這一點?

輸出的文本文件看起來是這樣的:

Dear Mr. 
Jones, 
welcome to our company! 

Your sysadmin 

但它應該是這樣的:

Dear Mr. Jones, 
welcome to our company! 

Your sysadmin 

CSV文件:

Userid;GivenName;SirName;Sex 
JACKS;Tom;Jackson;M 
MILLE;Kate;Miller;F 
JONES;Paul;Jones;M 

謝謝你你的幫助!

+0

寫入輸出只是寫入管道。通常這些對象在寫入主機或文件時會成爲單獨的行。下面的答案顯示了您可以使用的更簡單的應用程序,但最初的問題源於不瞭解您正在使用的cmdlet的功能。 – Joey

+0

@Joey對不起,我不熟悉腳本和PowerShell,仍然在學習。 – Clam

回答

1

無需過度複雜化!

$csv=Import-Csv users.csv -Delimiter ';' 
$csv |%{                      
    if ($_.Sex -eq 'M') {$prefix = 'Mr.'}              
    else{$prefix='Mrs.'}                  
    echo "Dear $prefix $($_.SirName)" |out-file -filepath "c:\temp\$($_.userid)welcome.txt" 
    get-content $fix |out-file "c:\temp\$($_.userid)welcome.txt" -Append     
}                        
1

首先,你應該使用匹配的記錄作爲源,而不是分裂的數據爲幾個無關聯的變量:

foreach($user in $imp) {...} 

一旦進入,你可以調用$user.sex等CSV字段來確定所需用戶的參數。這會使電子郵件生成代碼變爲:

foreach ($user in $imp) { 
    $title=('Mr.','Mrs.')[$user.sex -eq 'F'] # returns 'Mr.' if there's not 'F' in sex 
    @" 
    Dear $title $($user.surname)! 
    Welcome to our company! 

    Your sysadmin. 
    "@ # a multilined string with placeholders for variables 
} # that's all, folks 
+0

感謝幫助了我,但是我怎樣才能在3個獨立的文本文件中輸出這個文件,每個文件都在他自己的目錄中,這是在他的部分創建的:'foreach($ a in $ users){!(Test-Path $ dir \ $ a)){ New-Item -Path $ dir \ $ a -ItemType Directory } }' – Clam

+0

我不認爲這會像編碼一樣工作,因爲如果在''之前有_any_空格, 「@'。將它更容易地從循環中取出,也許使用格式化操作符來填充這裏的字符串。愛你訪問標題的方式btw – Matt

+0

你能給我舉個例子嗎?我是新來的腳本和PowerShell,現在掙扎一點點。 – Clam

相關問題