Как выполнить командный файл в альтернативном потоке данных в 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