Benutzer mit den meisten Antworten
txt oder csv Datei in Array schreiben

Frage
-
Hallo zusammen,
ich bin noch Powershell Anfänger und baue mir gerade ein Script mit dem ich eine Datei auf viele Rechner kopieren kann.
Das Script prüft auch ob der Rechner läuft usw.
Jetzt zu meinem Problem:
Ich habe die PC Namen in einer Datei vorliegen entweder txt oder csv, genau so die Nutzer/Userprofil Namen.
Beispiel(Pc Namen):
PC001
PC002
PC003
Beispiel(Benutzernamen):
Markus
Thomas
Marie
Ich wollte jetzt eigentlich mit einer for Schleife und einem Copy Befehl hingehen und die Datei immer mit dem PC Namen und Benutzernamen als Paar kopieren. Aber ich schaffe es nicht das die Werte eingelesen werden und bin relativ ratlos was ich machen soll.
Im Endeffekt sollte es am Ende so aussehen:
for ($i=0; $i -le $count; $i++) { $pcname=$pcnamearray[$i] $username=$usernamenamearray[$i] $personalpath = "\\$pcname\C$\Users\$username" $finalpath = "$personalpath\$decision\" Copy-item "$file" -Destination "$finalpath" -Recurse - passthru | foreach{$_.FullName; $len += ($_.length/1KB);}; Write-Host $len "Bytes kopiert"; $len=0; }
Vielleicht kann mir jemand ja helfen beim Importieren, habe es mit import-Csv und get-Content versucht aber nichts klappt.
Vielen Dank und Liebe Grüße
Antworten
-
Computername;Benutzername PC001;Markus PC002;Thomas PC003;Marie
Bau die CSV wie oben auf und arbeite mit:
$CSV = Import-CSV -path xxx.csv -delimiter ";" for( $i ........ ... $Computername = $CSV.Computername[$i] $Benutzername = $CSV.Benutzername[$i] ...
für $CSV.Computername[0] sollte dann PC001 rauskommen.
- Bearbeitet BeatYa Montag, 27. November 2017 14:19
- Als Antwort markiert Denniver ReiningMVP, Moderator Sonntag, 3. Dezember 2017 10:06
Alle Antworten
-
Moin,
"nichts klappt" ist keine Fehlermeldung. So wie Deine Dateien aussehen (eine Spalte ohne Kopf), müsste Get-Content sofort das gesuchte Array ausgeben. Lies die Dateien jeweils ein und gib einfach nur die resultierenden Arrays aus - stimmen die Daten?
Oder klemmt es in Wirklichkeit an einer anderen Stelle, sprich: erst beim Kopieren?
Evgenij Smirnov
I work @ msg services ag, Berlin -> http://www.msg-services.de
I blog (in German) @ http://it-pro-berlin.de
my stuff in PSGallery --> https://www.powershellgallery.com/profiles/it-pro-berlin.de/
Exchange User Group, Berlin -> http://exusg.de
Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com -
Hallo sorry war gestern ziemlich müde wie ich das geschrieben habe. Das kopieren an sich klappt, habe ein anderen Programmabschnitt programmiert wo der Benutzername und der PC Name manuell eingegeben werden.
Das Problem ist, das wenn ich get-Content benutze, das die ganze Text Datei in das array geschrieben wird sieht so aus:
$array[0]=Peter Markus Marie
$array[1]=Peter Markus Marie
Anstatt:
$array[0]=Peter
$array[1]=Markus
$array[2]=MarieDer Code:
$pcnamearray = @(get-Content -Path $pcnamepath) $usernamearray = @(get-Content -Path $usernamepath) #$pcnamearray = @(import-CSV -Path $pcnamepath) #$usernamearray = @(import-CSV -Path $usernamepath) for ($i=0; $i -le $count; $i++) { Write-Output "$usernamearray[$i]" } for ($i=0; $i -le $count; $i++) { Write-Output "$pcnamearray[$i]" } $result = Read-Host "If you want to quit enter (q)" if ($result -eq "q") { break } for ($i=0; $i -le $count; $i++) { $pcname=$pcnamearray[$i] #check Get-Variable true | Out-Default; Clear-Host; #Check if PC is online $check = Test-Connection -Computername "$pcname" -BufferSize 16 -Count 1 -Quiet if ($check -eq "True") { Write-Host -ForegroundColor Green "$(Get-Date) : $pcname is online" $username=$usernamenamearray[$i] $personalpath = "\\$pcname\C$\Users\$username" #check if(Test-Path $personalpath) { Write-Host -ForegroundColor Green "$(Get-Date) : Userprofile $username is valid" $finalpath = "$personalpath\$decision\" #Copy-item "$file" -Destination "$finalpath" -Recurse -passthru | foreach{$_.FullName; $len += ($_.length/1KB);}; Write-Host $len "Bytes kopiert"; $len=0; } else { Write-Host -ForegroundColor Red "$(Get-Date) : Userprofile $username is not valid" Read-Host 'Press any key to try the next client!' Get-Variable true | Out-Default; Clear-Host; } #check end } else { Write-Host -ForegroundColor Red "$(Get-Date) : $pcname is offline" Read-Host 'Press any key to try the next pc' } #check end
Ich weiß leider nicht, wie ich dem Programm sagen kann, das jede Zeile bzw. jeder Abschnitt der csv an eine neue Array Speicherstelle gespeichert wird.
-
Moin,
dann sind die Zeilenumbrüche in der Datei irgendwie nicht gut genug, stammen die Dateien vielleicht von einem Unix-Rechner?
Wenn Get-Content die ganze Datei in einen String schiebt, kannst Du -split anwenden, um daraus einen Array zu machen. Musst nur schauen, was genau zwischen den Namen steht, und evtl. Noch einen Trim anwenden.
Evgenij Smirnov
I work @ msg services ag, Berlin -> http://www.msg-services.de
I blog (in German) @ http://it-pro-berlin.de
my stuff in PSGallery --> https://www.powershellgallery.com/profiles/it-pro-berlin.de/
Exchange User Group, Berlin -> http://exusg.de
Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com -
Computername;Benutzername PC001;Markus PC002;Thomas PC003;Marie
Bau die CSV wie oben auf und arbeite mit:
$CSV = Import-CSV -path xxx.csv -delimiter ";" for( $i ........ ... $Computername = $CSV.Computername[$i] $Benutzername = $CSV.Benutzername[$i] ...
für $CSV.Computername[0] sollte dann PC001 rauskommen.
- Bearbeitet BeatYa Montag, 27. November 2017 14:19
- Als Antwort markiert Denniver ReiningMVP, Moderator Sonntag, 3. Dezember 2017 10:06
-
Wow super das obere hat mein Problem gelöst und funktioniert super einfach :) Vielen Dank an alle :)
Mein fertiger Code sieht jetzt so aus:
if($Result -eq "5") { $status="false" $decision = Read-Host "Where do you want to copy the file to? Desktop, Downloads etc." Get-Variable true | Out-Default; Clear-Host; Write-Output "What file do you want to deploy?" $file = Open-FileDialog -Title "Select a file" -Directory "C:" $count = (Get-Content -path $pcnamepath).length $count = $count-2 #Write-Output "COUNT= $count" $starter=0 $CSV = Import-CSV -path $pcnamepath -delimiter ";" $result = Read-Host "If you want to quit enter (q) otherwise press any key" if ($result -eq "q") { break } Get-Variable true | Out-Default; Clear-Host; for($i=0;$i-le $count;$i++) { $Computername = $CSV.Computername[$i] $Benutzername = $CSV.Benutzername[$i] #Check if PC is online $check = Test-Connection -Computername "$Computername" -BufferSize 16 -Count 1 -Quiet if ($check -eq "True") { Write-Host -ForegroundColor Green "$(Get-Date) : $Computername is online" $personalpath = "\\$Computername\C$\Users\$Benutzername" #check if(Test-Path $personalpath) { Write-Host -ForegroundColor Green "$(Get-Date) : Userprofile $Benutzername is valid" $finalpath = "$personalpath\$decision\" Copy-item "$file" -Destination "$finalpath" -Recurse -passthru | foreach{$_.FullName; $len += ($_.length/1KB);}; Write-Host $len "Bytes kopiert"; $len=0; } else { Write-Host -ForegroundColor Red "$(Get-Date) : Userprofile $Benutzername is not valid" } #check end } else { Write-Host -ForegroundColor Red "$(Get-Date) : $Computername is offline" } #check end } Write-Output "`n" Write-Host -ForegroundColor Green "$(Get-Date) : Copying of the files was successfull" Write-Output "`n" $status = Read-Host "Do you want to exit? [y]es or [n]o" if ($status -eq "y") { exit } }
Vielen vielen Dank
LG