Убедитесь, что Xcopy сделал Copy Anything - PullRequest
0 голосов
/ 19 октября 2019

Я пытаюсь в powershell проверить, действительно ли xcopy что-то скопировал. Спасибо за любую помощь.

    xcopy /D /S /E "C:\folder1\*.*" "C:\folder2" /y
     IF %CopiedFilesCount% >0  {

       Start-Process C:\folder3\execute.bat

     }



else{
"0 file copied"
}

В файле bat этот код делает почти то, что я не хочу. Попытка изменить «SourceFile» на «SourceFolder» и «DeleteFile» на «выполнить команду или файл»

    setlocal EnableExtensions DisableDelayedExpansion

set "SourceFile=C:\folder1\file2.txt"
set "DeleteFile=test.txt"
set "DestinationDirectory=C:\folder2\"

for /F %%I in ('%SystemRoot%\System32\xcopy.exe "%SourceFile%" "%DestinationDirectory%" /C /D /Q /Y 2^>nul') do set "CopiedFilesCount=%%I"

if %CopiedFilesCount% GTR 0 del "%DeleteFile%"

1 Ответ

0 голосов
/ 19 октября 2019

PowerShell будет захватывать стандартный вывод любой команды в виде строки или массива строк.

Оттуда вы можете использовать регулярное выражение для сбора количества копий файлов в переменной $ Matches, которая создается с помощью -матч. Примечание. Переменная $ Matches заполняется только при передаче одной строки. Вы можете использовать -match, чтобы получить правильную строку из массива, но затем вам нужно снова сопоставить, чтобы получить группы захвата. "?"создает именованную группу захвата, к которой мы можем получить доступ как свойство $ Matches.

$result = xcopy /D /S /E "C:\folder1\*.*" "C:\folder2" /y
($results | Where-Object {$_ -match "(\d+) File"}) -match "(?<Count>\d+) File"
if ([int]$Matches.Count -gt 0) {
  # Do Stuff
}
else {
  # Write a message, write to a log, whatever
}
...