Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.12.2009, 10:44   #1
alvazor
Форумчанин
 
Регистрация: 02.07.2009
Сообщений: 122
По умолчанию Можно ли закрыть папку Explorer из bat-файла?

Подскажите, уважаемые профессионалы!
Текст bat-файла ниже:

@echo off
rem данный bat-файл располагается в произвольном месте ПК
rem в папке с именем, например, SetCalc и выполняет следующее:

rem создает на рабочем столе папку Mik и файл Calc_MKS.xls в ней
MD "%USERPROFILE%\DESKTOP\Mik"
@echo .>"%USERPROFILE%\DESKTOP\Mik\Calc_M KS.xls"

rem сохраняет адрес исходной папки SetCalc, откуда запущен bat-файл
PUSHD %CD%
rem открывает вновь созданную папку Mik
@explorer /e, /root, %USERPROFILE%\Desktop\Mik
rem открывает новый файл Calc_MKS.xls
@CD /d "%USERPROFILE%\DESKTOP\Mik"
@start Calc_MKS.xls

rem восстановление адреса исходной папки SetCalc, откуда запускался bat-файл
POPD
rem вот этот адрес:
echo %CD%
pause

rem теперь исходную папку SetCalc надо закрыть
rem ?? exit %CD% - не реагирует, можно ли это сделать в принципе?
rem или хотя бы закрыть любую открытую папку explorer.exe
exit
alvazor вне форума Ответить с цитированием
Старый 28.12.2009, 11:11   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
хотя бы закрыть любую открытую папку explorer.exe
А если вообще не открывать эту папку?
Вам же файл надо только файл открыть...

Я плохо знаком с синтаксисом BAT-файлов, поэтому могу предложить только скрипт VBS.
Сохраните этот код в файл с именем 1.vbs, и запустите его двойным щелчком мыши:

Код:
DesktopPath = CreateObject("WScript.Shell").SpecialFolders("Desktop") & "\"
On Error Resume Next: MyFolder = "Mik"
CreateObject("Scripting.FileSystemObject").CreateFolder DesktopPath & MyFolder
Filename = "Calc_M KS.xls": FilePath = DesktopPath & MyFolder & "\" & Filename
Set XL = CreateObject("Excel.Application")
XL.Visible = True: XL.Workbooks.Add.SaveAs FilePath

Последний раз редактировалось EducatedFool; 28.12.2009 в 11:21.
EducatedFool вне форума Ответить с цитированием
Старый 28.12.2009, 12:30   #3
alvazor
Форумчанин
 
Регистрация: 02.07.2009
Сообщений: 122
По умолчанию

Спасибо, EducatedFool! Попробовал Ваш вариант, папка и файл без проблем создаются, файл открывается, причем все куда эффектней, чем из батника...
К сожалению, это только кусочек надобности...
У меня следующая задача:
- есть установочная папка SetCalc (в штатном варианте расположена на CD, но может располагаться и в любом другом месте), которая содержит файл надстройки *.xla, файл со стартовыми данными для надстройки *.txt, а также файлы инсталляции и деинсталляции, с которыми и вожусь
- пользователь открывает эту папку, запускает файл инсталляции, после чего:
1 Файл надстройки копируется в AddIns (в разных версиях Excel - свой путь), что автоматом включает надстройку в коллекцию, не требуя при этом включения макросов
2 На рабочем столе появляеся папка Mik, в которую копируется файл *.txt с данными, создается новый "чистый" файл Calc_MKS.xls, этот файл и сама папка открываются (если не открыть папку - ее теряют, т.к. у многих рабочий стол - мозаика из папок), а исходную папку хотелось бы закрыть, чтобы глаза не мозолила больше (норовят почему-то запустить файл надстройки оттуда, хотя он у меня запрещен для пуска при включенных макросах)
3 Надстройка доступна для пуска только из файла Calc_MKS.xls После ее инсталляции (галочка) в меню появляется новая строка для пуска.
Ну и все это должно работать для разных ОС начиная с NT и для версий Excel с 2003 SP3 и старше
Ваша программа интуитивно понятна, хотя детали синтаксиса непривычны. И все-таки из VBS папку explorer-а можно закрыть?
alvazor вне форума Ответить с цитированием
Старый 28.12.2009, 12:46   #4
alvazor
Форумчанин
 
Регистрация: 02.07.2009
Сообщений: 122
По умолчанию

В дополнение
Вообще-то с использованием переменной окружения путь к папке AddIns одинаков для всех версий Excel:

if not exist "%APPDATA%\Microsoft\AddIns" goto error
copy calc_MKS.xla "%APPDATA%\Microsoft\AddIns" >nul
-
-
-
goto exit
:error
echo 
:exit
alvazor вне форума Ответить с цитированием
Старый 28.12.2009, 15:20   #5
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
К сожалению, это только кусочек надобности...
У меня следующая задача:
В этом случае проще использовать VBS, нежели BAT - так проще выполнить задачу.
Хотя я рекомендовал бы использовать бесплатную программу Inno Setup - она сама скопирует нужные файлы в нужные папки.

Цитата:
1 Файл надстройки копируется в AddIns (в разных версиях Excel - свой путь)
Путь к этой папке можно взять из реестра Windows.
Его несложно получить средствами VBS - одна строка кода.

Цитата:
3 Надстройка доступна для пуска только из файла Calc_MKS.xls После ее инсталляции (галочка) в меню появляется новая строка для пуска.
Это уже надо делать средствами самой надстройки - пусть она проверяет, из какого файла её пытаются использовать.

Цитата:
Ну и все это должно работать для разных ОС начиная с NT и для версий Excel с 2003 SP3 и старше
Работать, скорее всего, будет везде. Но проверить код на NT\95\98\Me я не смогу.
С Вистой и 7-кой могут возникнуть сложности - зависит от настроек безопасности ОС.
Проблемы могут возникнуть из-за антивирусов - но тут тоже надо проверять.

Цитата:
Вообще-то с использованием переменной окружения путь к папке AddIns одинаков для всех версий Excel:
"%APPDATA%\Microsoft\AddIns"
Я бы не заявлял это с уверенностью...
Путь надо читать из реестра - а вдруг пользователь переименует папку, или переместит её?

Вспомните хотя бы свою строку "%USERPROFILE%\DESKTOP\Mik" -
работать она будет только на англоязычных системах, ибо папка Рабочий стол в разных локализациях ОС называется по-разному.
Именно поэтому я взял путь к ней из реестра: CreateObject("WScript.Shell").Speci alFolders("Desktop")


Короче, я рекомендую такой вариант:

1) Создаёте инсталлятор при помощи Inno Setup (который будет отображать стандартный мастер установки программы)

2) подготавливаете все Ваши файлы (exe-файл - инсталлятор, надстройку, VBS - скрипт, файлы TXT, и т.п.), и помещаете все это в одну папку

3) Создаёте SFX-архив из этой папки при помощи WinRAR (получается обычный exe-файл с выбранной Вами иконкой, который при запуске без лишних вопросов распаковывает ВСЕ упакованные в него файлы во временную папку, и запускает выбранный Вами exe-файл - инсталлятор)


Как это все будет работать:
1) Пользователь запускает SFX - ничего не видит (в это время файлы распаковываются с CD во временную папку на жестком диске)

2) Автоматически запускается инсталлятор - пользователь проходит все шаги установки программы (с выбором папок, ярлыков, и т.д. и т.п.)
Инсталлятор сам скопирует нужные файлы в нужные места, при этом найдет (или создаст) все необходимые папки.

3) По окончании установки автоматически запускается VBS-скрипт (пользователь опять ничего не видит).
Что будет делать скрипт? Не знаю. К примеру, копировать надстройку из папки установки в папку AddIns, подключать эту надстройку, или что-то ещё.

Написано много, но делается это все достаточно просто и быстро.
Файлы сценариев Inno Setup пишутся очень просто. Вот пример:

Цитата:
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING .ISS SCRIPT FILES!

[Setup]
AppName=Cross Project
AppVerName=Cross Project ver. 2.0.9
DefaultDirName={pf}\MyFolder\Cross
DefaultGroupName=Cross
UninstallDisplayIcon={app}\MyProg.e xe
OutputDir=SetupFile

[Files]
Source: "MSFLXGRD.OCX"; DestDir: "{sys}" ; Flags: regserver sharedfile
Source: "MSWINSCK.OCX"; DestDir: "{sys}" ; Flags: regserver sharedfile
Source: "DNS_Database.DNS"; DestDir: "{app}" ; Flags: onlyifdoesntexist
Source: "Addin_Copy.xla"; DestDir: "{app}" ; Flags: onlyifdoesntexist

[Icons]
Name: "{group}\Cross Project"; Filename: "{app}\Addin_Copy.xla"

Цитата:
И все-таки из VBS папку explorer-а можно закрыть?
Можно, но сложно.
Вопрос можно? А зачем открывать папку (окно Explorer-a), если её тут же надо будет закрывать?
Надо окно - не проблема, открывается оно одной строкой кода.
Не надо, чтобы открывалось - так просто не открывайте его...

Последний раз редактировалось EducatedFool; 28.12.2009 в 15:34.
EducatedFool вне форума Ответить с цитированием
Старый 28.12.2009, 16:09   #6
alvazor
Форумчанин
 
Регистрация: 02.07.2009
Сообщений: 122
По умолчанию

еще раз спасибо - боольшущее - EducatedFool !!
все логично, буду пережевывать
Про окно explorer-а я потому заговорил, что большинство потенциальных пользователей иначе как из окна и не запускают файлы (т.е. проводником просто не умеют или не желают пользоваться). Открывают в окне диск, указанную папку и из нее запускают установочный файл, соответственно, эта папка и остается открытой.
Ну и кроме того, это старая проблема, когда рабочая станция АСУ ТП впадает в ступор из-за огромного количества окон, образованных автоматически диагностическими П/П и нерадивыми пользователями. Наши спецы делали экзешник для конвейерного удаления окон сверх заданного количества - но для данного случая это уже слишком -(
Заодно уж еще проблемка по данной теме.
В моей проге в процессе отладки кроме vba, excel и offise в предпочтениях прописалась Microsoft Offise11 Object Library (команды меню). При пуске надстройки на чужой машине, как правило, идет запрос на установку этой библиотеки. И хоть достаточно кликнуть ОК - само сообщение раздражает. А как заранее эту связь прописать - не соображу. Кроме того, в excel 2007 вряд ли такая библиотека есть.
Кстати, пока к каждой команде vba или excel не приписал vba. или application. - более новые версии еще и "старые" библиотеки требовали прописать...
С уважением и надеждой -)
alvazor вне форума Ответить с цитированием
Старый 28.12.2009, 16:20   #7
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
в предпочтениях прописалась Microsoft Office 11 Object Library
Эта библиотека не нужна в большинстве случаев.
Она нужна, если в проекте присутствуют формы.
Если форм нет - убирайте галочку, и заменяйте константы вида mso... их значениями.

С этой библиотекой, вроде, проблем не возникает - при открытии проекта в более новых версиях excel обычно автоматически (без каких-либо вопросов) подключается более новая версия библиотеки Microsoft Office Object Library (при отсутствии нужной версии)

Цитата:
Кстати, пока к каждой команде vba или excel не приписал vba. или application.
Ну это, как мне кажется, уже лишнее...
Ни разу ничего подобного не дописывал - и всё работало без лишних вопросов.

Цитата:
Ну и кроме того, это старая проблема, когда рабочая станция АСУ ТП впадает в ступор из-за огромного количества окон, образованных автоматически диагностическими П/П и нерадивыми пользователями.
Ну так используйте Inno Setup - она создаст необходимые ярлыки программы в меню Пуск - Программы.
А пользоваться этим меню умеют даже самые тупые пользователи
EducatedFool вне форума Ответить с цитированием
Старый 28.12.2009, 16:37   #8
alvazor
Форумчанин
 
Регистрация: 02.07.2009
Сообщений: 122
По умолчанию

еще ПАСИБ!
Да, у меня формы, и весьма насыщенные
А с vba. и application. - как установил SP3, так и заверещал дебугер, и на других компах с SP3 - тоже верещал (писал и отлаживал прогу на 2003 без SP - может их-за этого?)
Более того, не стала восприниматься команда инсталляции надстройки из самой надстройки - не могу, пишет, и все тут, только из другого файла работает...
alvazor вне форума Ответить с цитированием
Старый 28.12.2009, 16:38   #9
alvazor
Форумчанин
 
Регистрация: 02.07.2009
Сообщений: 122
По умолчанию

Пошел переваривать, а то несварение будет
alvazor вне форума Ответить с цитированием
Старый 04.05.2010, 09:40   #10
alvazor
Форумчанин
 
Регистрация: 02.07.2009
Сообщений: 122
По умолчанию

Для завершения темы...
Текущее окно закрывается сочетанием клавиш Alt + F4
Вставил в скрипт соотв. команду - получилось

Set oShell = CreateObject("WScript.shell")
.......
'последняя команда скрипта:
oShell.SendKeys "%{F4}"
alvazor вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
я удалил папку можно ее востановить мандарин Операционные системы общие вопросы 11 19.07.2012 21:05
можно ли закрыть окно папки из bat-файла (explorer.exe)? alvazor Операционные системы общие вопросы 2 23.12.2009 17:05
Закрыть папку Kreadlling Общие вопросы C/C++ 1 08.09.2009 18:24
Можно ли программно переименовать папку Rusl92 Общие вопросы Delphi 3 13.09.2008 12:52
Программно закрыть Internet Explorer 7 Vladimir K. Общие вопросы Delphi 10 21.01.2008 20:00