Войти

Показать полную графическую версию : Разное поведение SET при запуске из командной строки и из файла


madeinussr
09-05-2015, 02:55
Приветствую! Помогите разобраться.
Сделал пакетный файл такого содержимого:
cls
@echo off

rem Путь к архиватору
set arc=%ProgramFiles%\7-Zip\7z.exe

rem Путь к папке с исходными директориями
set src=%ProgramFiles%\7-Zip\

rem Путь к папке, куда будут помещены выходные файлы
set dest=H:\123

rem Расширение выходных файлов
set ext=7z

cd %src%
for /D %%d in (*) do (
echo Compressing %%d.7z...
if exist "%dest%\%%d.%ext%" del /Q /F "%dest%\%%d.%ext%"
"%arc%" a -p111111 -mhe=on "%dest%\%%d.%ext%" "%src%\%%d" > NUL
)

echo Done!
pause

При запуске самого BAT-файла из командной строки все отлично, но при запуске его же из проводника сообщает, что системе не удается найти указанный путь. Убрал @echo off, оказалось что в %ProgramFiles% как буд-то находится "C:\Program Files (x86)". Хотя в SET видно что в %ProgramFiles% находится "C:\Program Files", а "C:\Program Files (x86)" находится в %ProgramFiles(x86)%. В чем проблема? Объясните.

gora
09-05-2015, 04:56
В чем проблема? »
Проблема в среде запуска. При запуске в x64 среде Вы будете иметь
%ProgramFiles%=C:\Program Files, а при запуске в x86 среде будете иметь
%ProgramFiles%=C:\Program Files (x86)
Проверить, в какой среде произведен запуск батника, можно посмотрев в диспетчере задач на процесс cmd.exe. Если после него идет суффикс *32 значит батник запущен в x86 среде (из 32-разрядного приложения).

Iska
09-05-2015, 05:53
но при запуске его же из проводника »
Из-под Проводника?! А не из-под какого-нибудь стороннего 32-разрядного файлового менеджера?

madeinussr
09-05-2015, 13:38
Из-под Проводника?! А не из-под какого-нибудь стороннего 32-разрядного файлового »

Каюсь... Total Comander. Извиняюсь, что в ввел в заблуждение. Проверил в проводнике - все работает.
Почему так происходит? Ведь в SET же указано, что в %ProgramFiles% находится "C:\Program Files", а в %ProgramFiles(x86)% находится "C:\Program Files (x86)" (ведь приложение выполняет операционная система а не файловый менеджер, служащий для навигации). Как из 32 разрядного приложения вызвать "C:\Program Files"? Только явно, через переменные среды не получится?

Всех с праздником!

gora
09-05-2015, 13:49
через переменные среды не получится? »
@Echo Off
Set xOS=x64& If "%PROCESSOR_ARCHITECTURE%"=="x86" If Not Defined PROCESSOR_ARCHITEW6432 Set xOS=x86
Echo %xOS%
Set PF=%ProgramFiles%
If %xOS%==x64 Set PF=%ProgramW6432%
Echo %PF%
Pause

mwz
09-05-2015, 14:22
Каюсь... Total Comander. Извиняюсь, что в ввел в заблуждение »

Последние версии Total Commander существуют как в 32-х, так и в 64-битном исполнении.

При установке комбинированной версии (последняя – tcm851ax32_64.exe) ставятся и та и другая. В 64-битной среде имеет смысл пользоваться 64-битной версией, а 32-битную использовать лишь в особых случаях, когда без неё вам лично не обойтись: в ней существуют и некоторые другие ограничения, которые 64-битная Windows накладывает на 32-битные программы и на их окружение без ведома самих этих программ.

Iska
09-05-2015, 23:25
Почему так происходит? Ведь в SET же указано, что в %ProgramFiles% находится "C:\Program Files", а в %ProgramFiles(x86)% находится "C:\Program Files (x86)" (ведь приложение выполняет операционная система а не файловый менеджер, служащий для навигации). »
Потому, что было решено использовать именно такое поведение среды для исполнения x86-приложений в x64-окружении.

WoW64 - Wikipedia, the free encyclopedia (http://en.wikipedia.org/wiki/WoW64);
File System Redirector (Windows) (https://msdn.microsoft.com/en-us/library/windows/desktop/aa384187(v=vs.85).aspx) из раздела Running 32-bit Applications (Windows) (https://msdn.microsoft.com/en-us/library/windows/desktop/aa384249(v=vs.85).aspx).




© OSzone.net 2001-2012