Что нового

Странное поведение xcopy в скопилированом консольнос скрипте.

mitiya

Новичок
Сообщения
75
Репутация
0
Код:
#pragma compile(Console, True)
ConsoleWrite("Start"&@CRLF)
$code = RunWait(@ComSpec & ' /k ' & 'copy' , @SystemDir)
$code = RunWait(@ComSpec & ' /k ' & 'xcopy' , @SystemDir)
ConsoleWrite("Finish " & $code)
exit


Вот такой код для примера.
При запуске скомпилированого скрипта команда copy выводит в консоль "The syntax of the command is incorrect."
А команда xcopy ничего не выводит, и вообще ничего не делает. При том видно что cmd то запускается.
Тут специально я использовал ключ /k что бы окно не закрывалось само. (но точно такая же проблема и с /c)

При этом если запускать не откомпелированый скрипт то xcopy запускается нормально. И если даже скомпелировать без #pragma compile(Console, True), то то же все норм, тогда в консоль сообщения ConsoleWrite не выводятся.
 
Последнее редактирование:

Oki

Осваивающий
Сообщения
287
Репутация
36
Код:
$code = RunWait(@ComSpec & ' /k' & 'xcopy' , @SystemDir)
А команда xcopy ничего не выводит, и вообще ничего не делает.
Здесь не команда "xcopy", а ключ "/kxcopy". Такой же пробел, как в предыдущей строке, отсутствует. Есть ли в принципе смысл в том, чтобы константные строки простого текста разбивать на операнды склеивания, лишь орошая почву для вероятных ошибок такого свойства?
Сообщение автоматически объединено:

И что будет, если использовать другую функцию?
Код:
ShellExecuteWait()
Бывают ситуации, с которыми она лучше справляется.
 
Последнее редактирование:
Автор
M

mitiya

Новичок
Сообщения
75
Репутация
0
Здесь не команда "xcopy", а ключ "/kxcopy". Такой же пробел, как в предыдущей строке, отсутствует. Есть ли в принципе смысл в том, чтобы константные строки простого текста разбивать на операнды склеивания, лишь орошая почву для вероятных ошибок такого свойства?
Сообщение автоматически объединено:

И что будет, если использовать другую функцию?
Код:
ShellExecuteWait()
Бывают ситуации, с которыми она лучше справляется.
пробел походу парсер съел. Посмотрел у себя, пробел есть.

Код:
ShellExecuteWait(@ComSpec, '/k xcopy')

Код:
ShellExecuteWait('xcopy')



запускает xcopy в отдельном окне. В основную консоль не выводит. Это конечно лучше чем ничего. Но хотелось бы конечно понять в чем проблема.
 

Alecsis

Осваивающий
Сообщения
69
Репутация
27
Код:
ShellExecuteWait('xcopy')

запускает xcopy в отдельном окне. В основную консоль не выводит. Это конечно лучше чем ничего. Но хотелось бы конечно понять в чем проблема.
Для начала проблема в том, что Вы запускаете xcopy без параметров <что копировать> <и куда>. Соотв-но утилита вываливает сообщение об ошибке и завершает работу. Попробуйте и увидите вот это:
Код:
RunWait(@ComSpec & ' /k xcopy')

ttXCopy.png
 
Автор
M

mitiya

Новичок
Сообщения
75
Репутация
0
Для начала проблема в том, что Вы запускаете xcopy без параметров <что копировать> <и куда>. Соотв-но утилита вываливает сообщение об ошибке и завершает работу. Попробуйте и увидите вот это:
Код:
RunWait(@ComSpec & ' /k xcopy')

Посмотреть вложение 5648
xcopy ничего не выдает, а должен выдавать сообщение о том что ему нужны параметры.
Я упростил код до самой проблемы.

Изначально, в моем коде конечно запускалось все с параметрами копирования. И оно работало пока я отлаживал.
и проблема проявилась только после компиляции.
 

Alecsis

Осваивающий
Сообщения
69
Репутация
27
xcopy ничего не выдает, а должен выдавать сообщение о том что ему нужны параметры.
Я упростил код до самой проблемы
Возможно, дело во флажке $RUN_CREATE_NEW_CONSOLE
Код:
;#pragma compile(Console, True)
#pragma compile(UPX, False) ; если True, то M$ Defender может прибить .exe-шник
#include <AutoItConstants.au3>
Opt('MustDeclareVars', True)
Run(@ComSpec & ' /k xcopy', Null, @SW_SHOW,  $RUN_CREATE_NEW_CONSOLE)

#pragma compile(Console, ……) в данном случае ни на что не влияет,
заводится как из-под SciTE, так и в скомпиленном виде
 
Последнее редактирование:
Автор
M

mitiya

Новичок
Сообщения
75
Репутация
0
Возможно, дело во флажке $RUN_CREATE_NEW_CONSOLE
Код:
;#pragma compile(Console, True)
#pragma compile(UPX, False) ; если True, то M$ Defender может прибить .exe-шник
#include <AutoItConstants.au3>
Opt('MustDeclareVars', True)
Run(@ComSpec & ' /k xcopy', Null, @SW_SHOW,  $RUN_CREATE_NEW_CONSOLE)

#pragma compile(Console, ……) в данном случае ни на что не влияет,
заводится как из-под SciTE, так и в скомпиленном виде
если скомпилировать без #pragma compile(Console, True)
то сообщения к консоль не выводятся
Код:
[URL='https://autoit-script.ru/docs/functions/consolewrite.htm']ConsoleWrite[/URL]("Start"&[URL='https://autoit-script.ru/docs/macros.htm']@CRLF[/URL])


с $RUN_CREATE_NEW_CONSOLE создает новое окно. и вроде работает.
но это точно так же как ShellExecuteWait('xcopy')

Не понятно почему некоторые команды пишут вывод в основное окно (copy например), а некоторые (как xcopy) нет.
 

Alecsis

Осваивающий
Сообщения
69
Репутация
27
Не понятно почему некоторые команды пишут вывод в основное окно (copy например), а некоторые (как xcopy) нет.
Если не секрет, то можно глянуть конкретный практический пример, где пишется/не пишется?
А то похоже, что мы говорим о разных вещах. У меня что так, что эдак выводится в консоль и «русским по чёрному» сообщает о неверном синтаксисе команды. И ещё: xcopy.exe = отдельная консольная утилита, а copy = внутренняя команда самого cmd.exe. Они даже про неверные параметры ком/строки сообщают по-разному.
 
Автор
M

mitiya

Новичок
Сообщения
75
Репутация
0
код в самом первом сообщении.
компилируете его в exe
запускаете его и видите
1674594283078.png

Первое сообщение Start это отработало ConsoleWrite("Start"&@CRLF)
Ошибка в синтаксисе команд это сообщение выдало copy RunWait(@ComSpec & ' /k ' & 'copy' , @SystemDir)
Видите оно выдало его в основное окно где все запущено.
Дальше пустота, это то место где запускается xcopy и должно бы выйти сообщение "Недопустимое число параметров Скопировано файлов: 0."
Но его нет.
В конце Finish 0 это ConsoleWrite("Finish " & $code)
0 это exit code от xcopy .
 

La2Angel

Новичок
Сообщения
146
Репутация
0
Код:
$code = RunWait(@ComSpec & ' /k ' & 'copy' , @SystemDir)
$code = RunWait(@ComSpec & ' /k ' & 'xcopy' , @SystemDir)


Если вы только так пытаетесь запустить, то ничего и не произойдет, параметров нет для исполнения. Либо опишите точнее, что вы хотите.

Так отрабатывает нормально все.

Код:
ConsoleWrite("Start"&@CRLF)
$pid= RunWait(@ComSpec & " /k " & "xcopy "&@ScriptDir&"\123.exe "&@ScriptDir&"\tmp\ /c /y", '', @SW_SHOW, 2)
$code = ''
While 1
    If Not StdoutRead($pid, False, False) = '' Then $code &= StdoutRead($pid, False, False) & @CRLF
    If @error Then ExitLoop
WEnd
ConsoleWrite("Finish " & $code)
exit
 
Последнее редактирование:
Верх