Команда копирования не работает с использованием пользовательского действия Wix
Вопрос
У меня есть следующее CustomAction
:
<CustomAction Id="CopyToSystem32" ExeCommand="copy /y 64bits.txt C:\Windows\System32" Directory="INSTALLFOLDER" Impersonate="no" Execute="deferred" Return="asyncWait" />
<InstallExecuteSequence>
<Custom Action="CopyToSystem32" After="InstallFiles" >VersionNT64</Custom>
</InstallExecuteSequence>
Поэтому, когда он обнаружит 64-разрядную ОС, он скопирует файл в папку System32.Если я выполняю это с помощью файла .bat, это работает нормально.Но я бы предпочел, чтобы это была пакетная команда.
В журнале записано следующее:
MSI (s) (74:AC) [10:08:33:473]: Executing op: ActionStart(Name=CopyToSystem32,,)
Action 10:08:33: CopyToSystem32.
MSI (s) (74:AC) [10:08:33:473]: Executing op: CustomActionSchedule(Action=CopyToSystem32,ActionType=3234,Source=C:\Program Files (x86)\SetupProject\,Target=copy /y 64bits.txt C:\Windows\System32,)
MSI (s) (74:AC) [10:08:33:474]: Executing op: ActionStart(Name=RegisterProduct,Description=Registering product,Template=[1])
Action 10:08:33: RegisterProduct. Registering product
MSI (s) (74:AC) [10:08:33:474]: Executing op: ChangeMedia(,MediaPrompt=Please insert the disk: ,MediaCabinet=1\cab1.cab,BytesPerTick=0,CopierType=1,,,SignatureRequired=0,,,IsFirstPhysicalMedia=1)
MSI (s) (74:AC) [10:08:33:474]: Executing op: DatabaseCopy(DatabasePath=C:\Windows\Installer\32ea43.msi,ProductCode={0C013216-61FB-4283-AF0A- 6CB264019F5B},,,)
MSI (s) (74:AC) [10:08:33:474]: Note: 1: 1402 2: UNKNOWN\Products\612310C0BF163824FAA0C62B4610F9B5\InstallProperties 3: 2
1: CopyToSystem32 2: 1631
Есть какие-нибудь идеи о том, почему мой ExeCommand
это не копирование моего файла?
Спасибо!
Решение
АФАИК copy
является частью интерпретатора командной оболочки, а не командой самой по себе.Например, вы можете проверить это, если вы, например,сделайте dir copy.* /s
в Windows
-папка.Не существует файла, который бы независимо реализовывал copy
.Что вы можете сделать:предварите вызов интерпретатора команд, например:
cmd /c copy /y 64bits.txt C:\Windows\System32
Тот Самый /c
-параметр сообщает интерпретатору о закрытии после выполнения (вы также могли бы использовать [%COMSPEC]
-переменная среды вместо cmd
).Вы также могли бы использовать CAQuietExecute
пользовательское действие для предотвращения всплывающего окна cmd, как описано здесь.
Может быть, вы могли бы также просто использовать CopyFile
-элемент для вашей задачи?Таким образом, вам не придется иметь дело с окном командной строки и т.д.