Проблема с Robocopy на Windows Server 2019 - PullRequest
0 голосов
/ 19 января 2020

У меня был скрипт robocopy, работающий на Windows Server 2008 (Powershell version 4) без проблем в течение 6 месяцев.

Недавно нам пришлось мигрировать с этой машины, чтобы запустить тот же сценарий с машины Windows Server 2019 (Powershell 5). Точно такой же сценарий больше не работает, и я не совсем уверен, в чем проблема. Сценарий таков:

# 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
}

Я не могу точно определить, что будет причиной проблемы, которую я вижу. Я пытался запустить каждую из команд в скрипте в одиночку, и когда я это делаю, я замечаю, что переменная $ RoboArgs кажется обрезанной, которая затем генерирует неполный $ FileDestination

$ RoboArgs с приведенным выше генерирует точно такой же вывод, как и на сервере 2008 / Powershell 4. Однако кажется, что powershell 5 обрабатывает это по-другому. Есть ли что-то, что я делаю не так или мне нужно добавить, чтобы заставить его работать правильно?

РЕДАКТИРОВАТЬ:

Вот пример того, что $ RoboArgs определяется как в Win2019 / Powershell5:

PS C:\> 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"

В основном он обрезается в том месте, где заканчивается первая строка, и генерирует пункт назначения таким же образом:

PS C:\> 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

Редактировать 2: Сравнивая это с Win2008 / Powershell4, он на самом деле делает то же самое в отношении неудачи, если есть разрыв строки. Я думаю, что реальная проблема заключается в том, как скрипт пытается определить источник и назначение. В 2008 / Powershell4 при запуске сценария все создается правильно, с правильным источником, местом назначения и файлом журнала. Запуск точно такого же сценария в 2019 году / Powershell5, похоже, вызывает проблему с тем, как Robocopy определяет эти пути, помещая оба пути: источник, место назначения и путь журнала в переменную источника, хотя это не так, как это определено:

PS C:\> echo $FileSource
FakeDirectory\FakeDirectory\D\{DAFD6721-E854-46F3-B5CF-7EE1861348A6}\Responses\01182020

PS C:\> echo $FileDestination
FakeDirectory\FakeDirectory\D\{DAFD6721-E854-46F3-B5CF-7EE1861348A6}\Responses\01182020

PS C:\> echo $log
/log:"I:\FakeDirectory\FakeDirectory\FakeDirectory\Logs\Folders_Changed_20200118_21.1\{DAFD6721-E854-46F3-B5CF-7EE1861348A6}_Responses_01182020.log"

PS C:\> echo $StandardSwitches
/copy:DAT /s /dcopy:DAT /V
...