user2371642
user2371642

Reputation: 1

PowerShell RoboCopy path issue

Objective: Robo copy from multiple machines on the network to a network share using variables for both the machine name and the currently logged on user.

What I have: txt file with a list of computernames.

Issue: I cannot get the foreach to work with the .split("\")[1] I use on the username variable to remove the domain prefix so I can use the output from that in the robocopy path

something like

    robocopy "\\$computername\c$\documents and settings\$username\backup" "\\networkshare\backup\$username\backup"

gives me the error You cannot call a method on a null-valued expression. At C:\Scripts\Test\backup.ps1:13 char:2

Here's what I have so far. Can somebody help please?

function Get-LoggedIn {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory=$True)]
        [string[]]$computername
    )

    foreach ($pc in $computername){
        $logged_in = (gwmi win32_computersystem -COMPUTER $pc).username
        $name = $logged_in.split("\")[1]
        "{1}" -f $pc,$name
    }
}

$computers = Get-Content "C:\Scripts\testcomputers.txt"

foreach ($computer in $computers) {
    $users = Get-LoggedIn $computer
}       

$SourceFolder = "\\$computer\c$\users\$users\desktop"
$DestinationFolder = "\\networkshare\backups\$users\backup\desktop"
$Logfile = "\\networkshare\backups\$users\backup\backuplog.txt"

Robocopy $SourceFolder $DestinationFolder /E /R:1 /W:1 /LOG:$Logfile

Upvotes: 0

Views: 2590

Answers (1)

Frode F.
Frode F.

Reputation: 54881

I see multiple errors here. You're not running the copy commands inside the foreach-loop. The username property recieved from WMI can often be in the following format:

domain\computer\username (or computer\domain\username, unsure since I'm on non-domain workstation now)

Anyways, the username is always the last part, so get it by using the index [-1] instead. Updated script (with indents!):

function Get-LoggedIn {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory=$True)]
        [string[]]$computername
        )

    foreach ($pc in $computername){
        $logged_in = (gwmi win32_computersystem -COMPUTER $pc).username
        $name = $logged_in.split("\")[-1]
        "{1}" -f $pc,$name
    }
}

$computers = Get-Content "C:\Scripts\testcomputers.txt"

foreach ($computer in $computers) {
    $users = Get-LoggedIn $computer

    $SourceFolder = "\\$computer\c$\users\$users\desktop"
    $DestinationFolder = "\\networkshare\backups\$users\backup\desktop"
    $Logfile = "\\networkshare\backups\$users\backup\backuplog.txt"

    & Robocopy $SourceFolder $DestinationFolder /E /R:1 /W:1 /LOG:$Logfile

}  

Upvotes: 1

Related Questions