none
txt oder csv Datei in Array schreiben RRS feed

  • 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

     

    Freitag, 24. November 2017 22:09

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.


    Montag, 27. November 2017 14:18

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

    Freitag, 24. November 2017 22:28
  • 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]=Marie

    Der 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.

     
    Samstag, 25. November 2017 10:10
  • 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

    Samstag, 25. November 2017 13:43
  • 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.


    Montag, 27. November 2017 14:18
  • 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

    Dienstag, 28. November 2017 21:21