Как выполнить командный файл в альтернативном потоке данных в Windows 7?

Обычно после создания исполняемого файла в качестве альтернативного потока данных, например:

type exec_this.bat > C:\blank.txt:exe.bat

можно просто сказать

start C:\blank.txt:exe.bat

запустить исполняемый файл. В Windows 7 все, что мне кажется, это "Доступ запрещен". или "Система не может найти файл $WHATEVER_THE_FILE_IS."

Как я могу выполнить этот командный файл?

2 ответа

Решение

Windows 7 молча удалила возможность выполнения чего-либо из ADS. Однако из командной строки DOS есть и другие параметры. Для пакетного файла вы можете выполнить построчно:

for /f "usebackq delims=φ" %i in (blank.txt:exe.bat) do %i

(Имейте в виду, что это на самом деле не выполняет пакетный файл в свой собственный процесс, он просто читает и выполняет каждую строку из файла. φ символ набирается с альтернативным кодом 2541. Вы хотите, чтобы разделитель был символом, который вы никогда не будете использовать в коде.)

Принятый ответ одновременно запускает только одну строку командного файла. Это прервет любую расширенную логику в пакетном файле. Но если вы используете временный файл, вы можете сделать это в одну строку:

      cat < blank.txt:exe.bat > temp.bat & temp.bat

Вы также можете выполнить сценарий PowerShell в альтернативном потоке данных с помощью аналогичной команды: (Хотя я уверен, что существует и чистый способ PowerShell.)

      cat < blank.txt:exe.ps1 > temp.ps1 & powershell .\temp.ps1

Пример

Создайте пакет в альтернативном потоке данных:notepad blank.txt:exe.bat

      if 6==7 then goto pie 
echo apple 
goto end 
:pie 
echo pie 
:end 

Сломанный:

      E:\broken>for /f "usebackq delims=φ" %i in (blank.txt:exe.bat) do %i

E:\broken>if 6==7 then goto pie
'if' is not recognized as an internal or external command,
operable program or batch file.

E:\broken>echo apple
apple

E:\broken>goto end

E:\broken>
The filename, directory name, or volume label syntax is incorrect.

E:\broken>echo pie
pie

E:\broken>
The filename, directory name, or volume label syntax is incorrect.

Лучше:

      E:\better>cat < blank.txt:exe.bat > temp.bat & temp.bat

E:\better>if 6 == 7 then goto pie

E:\better>echo apple
apple

E:\better>goto end
Другие вопросы по тегам