title: Issue with Robocopy on Windows Server 2019
body: <p>I've had a robocopy script running on Windows Server 2008 (Powershell version 4) with no issues for about 6 months now.  </p>
  
  <p>We've recently had to migrate off of this machine to initiate the same script off of a Windows Server 2019 (Powershell 5) machine.  The exact same script no longer works, and i'm not quite sure what the issue is.  The script is:</p>
  
  <pre><code># Run BCP Bat file to get list of folders that have changed in the past 12 days and save them to 
  \\xxxx\xxxx\xxx\xxx\xxx.bat
  
  # Select the starting directory to pull the CSV from.  The assumption is  that  the DB file can #be sent to a dedicated directory that just has only the CSV files 
  $Filerecentdir = "\\ZZZ\Z\ZZZ\ZZZZZ\ZZZZ\ZZZZZZ"
  #
  
  # Filtering for only CSV files
  $Filter = "*.csv"
  #
  
  # This PS command will search for the file with  the latest timestamp on it.  Coupling this with #the filter above, we turn $Filerecent into a variable consisting of the most recent CSV
  $Filerecent = Get-ChildItem -Path $Filerecentdir -Filter $Filter | Sort-Object LastAccessTime -Descending | Select-Object -First 1
  #
  
  # I concatenate $Filerecentdir with the $Filerecent variable to form the full path to the CSV
  $FullPath = Join-Path -path $Filerecentdir -ChildPath $Filerecent
  #
  
  # $roboSource variable uses import-csv cmdlet to parameterize the one (headerless) column that #the DB file creates
  $roboSource = Import-Csv -Header @("a") -Path $FullPath
  #
  
  # Arbitrary directory that i'm using to  store the logs.  We'll change this to something on the #file server so it can be viewable
  $logPath = "\\AAAA\A\AAAA\AAAA\AAAA\AAAA\"
  
  #creates a folder to seperate weekly logs based off the output of the bat script
  $weeklylogfolder = $Filerecent -replace '_.csv'
  New-Item -ItemType Directory -Force -Path "$($logPath)$($weeklylogfolder)"
  #
  
  # For each loop to iterate over every single row in the CSV
  Foreach($script in $roboSource)
  {
      # I used the two below variables to replace the two last trailing '\' in each entry
      $prefix = $script.a -replace '\{.+'
      $suffix = $script.a.Substring($prefix.Length) -replace '\\', '_' #keeping the {} in the file #name.
      #$suffix = $script.a.Substring($prefix.Length) -replace '[{}]' -replace '\\', '_'
      #
  
      #$logFileName = $prefix + $suffix
      $logFileName = $suffix
      #
  
      # Same switches that we used
      #$StandardSwitches = "/copy:DAT /s /dcopy:DAT /V /L" #no copy
      $StandardSwitches = "/copy:DAT /s /dcopy:DAT /V" #Copy
      #
  
      # Creates the log file in the same format that we used, so one log file per entry
      $log = "/log:`"$($logPath)$($weeklylogfolder)\$($logFileName).log`""
      #
  
      # Iterates through each row to create the source and destination
      $FileSource = "$($script.a)"
      $FileDestination = "$($script.a)"
      #
  
      # used this to surround the certain variables with double quotes, otherwise Robo fails
      $RoboArgs = '"I:\{0}" "Z:\{1}" {2} {3}' -f 
                  $FileSource, $FileDestination, $StandardSwitches, $log
  
      #
      Robocopy $RoboArgs
  }
  </code></pre>
  
  <p>I can't seem to pinpoint what would be causing the issue's I'm seeing.  I've tried to run each of the commands within the script alone, and when I do, I am noticing that the $RoboArgs variable seems to cut off which then generates an incomplete $FileDestination </p>
  
  <p>$RoboArgs with the above generates the exact same output as it does on server 2008/Powershell 4.  However, it seems that powershell 5 processes this differently.   Is there something I'm doing wrong or need to add in order to get this to process correctly?</p>
  
  <p>EDIT:</p>
  
  <p>Here's an example of what $RoboArgs is defined as in Win2019/Powershell5:</p>
  
  <pre><code>PS C:\&gt; echo $RoboArgs
  "I:\Fake-directory\Fake-directory\D\{DAFD6721-E854-46F3-B5CF-7EE1861348A6}\Fake\FakeDate" "Z:\Fake-Directory\Fake-Directory\D\{DAFD6721-E854-46F3-B
  5CF-7EE1861348A6}\Responses\01182020" /copy:DAT /s /dcopy:DAT /V /log:"I:\FakeDirectory\FakeDirectory\Fake\Logs\Folders_Changed_20200118_21.1
  \{DAFD6721-E854-46F3-B5CF-7EE1861348A6}_Responses_01182020.log"
  </code></pre>
  
  <p>It basically cuts off where the first line ends, and generates the destination in the same manner:</p>
  
  <pre><code>PS C:\&gt; Robocopy "I:\Fake-directory\Fake-directory\D\{DAFD6721-E854-46F3-B5CF-7EE1861348A6}\Fake\FakeDate" "Z:\Fake-Directory\Fake-Directory\D\{DAFD6721-E854-46F3-B
  5CF-7EE1861348A6}\Responses\01182020" /copy:DAT /s /dcopy:DAT /V /log:"I:\FakeDirectory\FakeDirectory\Fake\Logs\Folders_Changed_20200118_21.1
  \{DAFD6721-E854-46F3-B5CF-7EE1861348A6}_Responses_01182020.log"
  
  2020/01/18 23:17:21 ERROR 123 (0x0000007B) Opening Log File I:\FakeDirectory\FakeDirectory\Fake\Logs\Folders_Changed_20200118_21.1
  
  \{DAFD6721-E854-46F3-B5CF-7EE1861348A6}_Responses_01182020.log
  The filename, directory name, or volume label syntax is incorrect.
  
  
  -------------------------------------------------------------------------------
     ROBOCOPY     ::     Robust File Copy for Windows                              
  -------------------------------------------------------------------------------
  
    Started : Saturday, January 18, 2020 11:17:21 PM
     Source - I:\FakeDirectory\FakeDirectory\Fake\D\{DAFD6721-E854-46F3-B5CF-7EE1861348A6}\Responses\01182020\
       Dest - Z:\FakeDirectory\FakeDirectory\Fake\D\{DAFD6721-E854-46F3-B
  </code></pre>
  
  <p>Edit 2:
  Comparing this to Win2008/Powershell4, it actually does the same thing in regards to failing if there's a line break.  I think the real problem is how the script is trying to define the source and destination.  On 2008/Powershell4, running the script generates everything correctly, with the correct source, destination and log file. Running the exact same script on 2019/Powershell5 seems to generate a problem with how Robocopy is defining these paths, placing both Source, Destination, and Log path all into the source variable, even though that's not how it's defined:</p>
  
  <pre><code>PS C:\&gt; echo $FileSource
  FakeDirectory\FakeDirectory\D\{DAFD6721-E854-46F3-B5CF-7EE1861348A6}\Responses\01182020
  
  PS C:\&gt; echo $FileDestination
  FakeDirectory\FakeDirectory\D\{DAFD6721-E854-46F3-B5CF-7EE1861348A6}\Responses\01182020
  
  PS C:\&gt; echo $log
  /log:"I:\FakeDirectory\FakeDirectory\FakeDirectory\Logs\Folders_Changed_20200118_21.1\{DAFD6721-E854-46F3-B5CF-7EE1861348A6}_Responses_01182020.log"
  
  PS C:\&gt; echo $StandardSwitches
  /copy:DAT /s /dcopy:DAT /V
  </code></pre>