Страницы: 1
RSS
Выполнение команд CMD в Excel с записью результата в ячейке, Перенести данные из CMD в ячейку
 
День добрый.
Вопрос может показаться глупым, но изучаю VBA второй день.
Возникла необходимость создать документ, в котором:
в ячейку А1 вставляем путь к файлу на ПК, нажимаем кнопку, и в ячейку А2 вносятся данные, полученные при выполнении команды в CMD.
На данный момент я смог сделать лишь запись данных из командной строки в txt-файл (что не то, что нужно), при попытке указать xls-файл последний перестает открываться.
Можете подсказать как указать ячейку на листе как место, куда должны попасть данные из CMD?
Код
Sub Command()
    Shell "cmd.exe /c CertUtil -hashfile " & Range("A1") & " SHA512 > d:\files.txt"   
End Sub

Спасибо.
 
Цитата
Анатолий Миронов написал:
куда должны попасть данные из CMD
Вы не обижайтесь, но хрен чего понятно. А что в этом CMD? Почему, если используются макросы, не прописать в макросе все действия без всяких CMD?
Цитата
Анатолий Миронов написал:
последний перестает открываться
уверены? Что при этом пишет Excel? Что файл испорчен? Или открывается пустое окно? Если пустое окно, то просто откройте файл -вкладка Вид -Окно -Отобразить.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Анатолий Миронов, здравствуйте
Функция изменит переданную команду на ответ командной строки
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Дмитрий(The_Prist) Щербаков написал:
А что в этом CMD
Дим, это просто выполнени внешней CertUtil

Анатолий Миронов, обычный шелл не ловит ответ из STDOUT. Нужно Wscript.Shell и не Run а Exec только у вас стоит перенаправление STDOUT в файл. Его или убирать или тогда читать из него, только вот зачем, если можно прямо получить .

Jack Famous, Алексей, отшлепаю.Процедура написанная не прочтет до конца While Not TextStream.AtEndOfStream не просто так ставится.
Изменено: БМВ - 06.10.2020 17:53:39
По вопросам из тем форума, личку не читаю.
 
Цитата
БМВ написал:
Дим, это просто выполнени внешней CertUtil
Так и есть, поэтому и ЦМД.
Цитата
Дмитрий(The_Prist) Щербаков написал:
уверены? Что при этом пишет Excel? Что файл испорчен?
Да, пишет что файл испорчен. Текстовый же документ, в который ведет путь, в порядке, и содержит корректную информацию:
Хэш SHA512 d:\1.jpg:
4126c2f4dd528766e8cf75af31a34921bc8de8c5a9881ae97a58a9e03819­dc24956204df131d89c66d41514e9379aad184213a396ef4baf5c9720602­bde9ba3d
CertUtil: -hashfile — команда успешно выполнена.

Jack Famous, я не могу до конца понять что именно делает код, который Вы написали.

БМВ, я подробнее изучу информацию по предоставленной ссылке, но "зачем читать, если можно прямо получить" - тоже не понял. Есть более простые способы?
 
Цитата
Анатолий Миронов написал:
зачем читать, если можно прямо получить"
не надо использовать > d:\files.txt, тогда не придется читать что там в файле.
Если использовать "cmd.exe /c CertUtil -hashfile " & Range("A1") & " SHA5" и то что по ссылке, то в переменной сразу то что написано в файле. Останется только положить в нужную ячейку сразу или предварительно обработав.
По вопросам из тем форума, личку не читаю.
 
Цитата
БМВ: отшлепаю
нинада  :oops:
Мне для SUBSTR вполне хватало))) дай ссыль про эти концестроки  :D
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
БМВ написал:
Если использовать "cmd.exe /c CertUtil -hashfile " & Range("A1") & " SHA5" и то что по ссылке, то в переменной сразу то что написано в файле. Останется только положить в нужную ячейку сразу или предварительно обработав.
В этом и есть суть вопроса. КАК это сделать?)
Если я просто удаляю > d:\files.txt, оно вообще никуда не идет.
Создать переменную, значение которой будет равно тому, что выдал Shell, и место которой я укажу, например Range ("A2")?
 
Посмотрите это
Может поможет.
Изменено: БМВ - 06.10.2020 19:20:43
По вопросам из тем форума, личку не читаю.
 
К сожалению, не особо. Я читал все это перед созданием поста, но как видно - безуспешно.
Я правильно понял, что в том коде, что по ссылке - есть переменная cmd (у меня на нее ругается прога, пишет что not defined), которой как раз привязано действие?
Ощущение что ничего не понял.
Если это не слишком нагло с моей стороны - могу я попросить объяснить немного доступнее?  
 
Код
Sub command()
Set WshExec = CreateObject("WScript.Shell").exec("CertUtil -hashfile " & Range("A1") & " SHA512")
While WshExec.Status = 0
Wend
Range("a2") = Application.WorksheetFunction.Trim(WshExec.StdOut.ReadAll)
End Sub


Только учтите , будет моргать окно и от этого не избавится.
но если надоест, то
https://gist.github.com/jermity/b81622a2b10449c6be99
Изменено: БМВ - 06.10.2020 20:56:15
По вопросам из тем форума, личку не читаю.
 
БМВ, это решение было за гранью моего понимания, спасибо.
Добавил строку Dim WshExec As Object (Run ругался на переменную), заработало.
Изучать еще и изучать...

Еще раз спасибо, вопрос решен.
 
Снова ищу способы получения ответа командной строки. Без морганий. Быстро. Надёжно.
    Пока что самым нормальным кажется печать результата в txt с последующим считыванием, анализом и удалением.
API очень заманчиво, но пока не взлетает
P.S.: Невероятно похожая тема
Изменено: Jack Famous - 21.05.2024 13:44:16
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал:
P.S.:  Невероятно похожая тема
почему похожая? Или Анатолий Миронов это невретояно похожий другой Анатолий Миронов?
По вопросам из тем форума, личку не читаю.
 
БМВ, не заметил автора) подумал, что стак сканирует интернеты  :D

БМВ, помоги, пожалуйста, получить ответ этой командной строки в VBA
"C:\Program Files\7-Zip\7z.exe" l "c:\Test.xlsx.zip"

Это список файлов в архиве с путями. Через cmd выводит.
Если добавить & " > d:\Answer.txt" — печатает, но только через cmd. Shell файл не создаёт никак.
В общем, мне нужна эта строка ответа: или напрямую, или через создаваемый текстовый файл.

UPD: вот так тоже пробовал, но не получается. Сейчас изучаю различия в своём и твоём вариантах.
Изменено: Jack Famous - 21.05.2024 14:09:26
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Код
Set WshShell = CreateObject("WScript.Shell")
cmd = """C:\Program Files\7-Zip\7z.exe"" l ""c:\Test.xlsx.zip"""
Set WshExec = WshShell.exec(cmd)
While WshExec.Status = 0
Wend
strOutput = Application.WorksheetFunction.Trim(WshExec.StdOut.ReadAll)
Debug.Print strOutput
По вопросам из тем форума, личку не читаю.
 
Jack Famous, если нужно разархивировать и получить список файлов, то без чтения ответа из командной строки можно обойтись:
https://excelvba.ru/code/UNZIP
 
БМВ, из многих, испробованных мной, вариаций, эта тоже была. К сожалению, только открывает cmd-окно по адресу 7z.exe

Цитата
Игорь: если нужно разархивировать и получить список файлов
спасибо, но не то. Список НЕАРХИВНЫХ файлов для меня получить не проблема. Распаковка всего архива в папку и сведение задачи к этому — вариант, конечно, но очень не хотелось бы. Дело в том, что архив, в моём случае — это "*.xlsx.zip", то есть книга Excel. Мало того, что полная распаковка займёт заметно больше времени, чем точечные правки, так ещё и велик риск, что после сбора папки обратно в архив это не будет корректной книгой.
    Кстати, 7z распаковывает заметно (около 2ух раз) быстрее, чем Shell32.NameSpace.

P.S.: Для получения полного списка всех файлов (и папок, если нужно) в архиве можно и Shell32.Namespace((sFolder)).Items рекурсивно погонять, но очень не хотелось бы…
Изменено: Jack Famous - 21.05.2024 16:13:01
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал:
из многих, испробованных мной, вариаций, эта тоже была.
может пути указал не верно у меня все срабатывает, естесвенно на моих файлах

По вопросам из тем форума, личку не читаю.
 
Цитата
Дело в том, что архив, в моём случае — это "*.xlsx.zip",
я прекрасно понял, для чего этот код
я использую его для извлечения картинок из файла Excel, и работает все чётко и сравнительно быстро даже на больших файлах
(но я в основном через WinRAR это делаю)
мой код проверен на сотнях разных компов, везде работает
И получение всех файлов с просмотром подпапок там есть - см. последний вариант кода в статье
Изменено: Игорь - 21.05.2024 16:19:55
 
Цитата
БМВ: может пути указал не верно у меня все срабатывает, естесвенно на моих файлах
попробуй не обычный архив, а из книги.

Игорь, ну, а вот мне нужно узнать перечень путей из архива, чтобы убедиться, что имя файла (с расширением), который я собираюсь заменить уникально без учёта структуры папок. Распаковывать для этого весь архив я не вижу смысла. Спасибо за вариант — для кого-то он может быть полезен.
Изменено: Jack Famous - 21.05.2024 16:33:14
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
БМВ написал:
может пути указал не верно у меня все срабатывает, естесвенно на моих файлах
надо из OEM в юникод преобразовывать
 
Цитата
testuser: надо из OEM в юникод преобразовывать
уверен, что проблема не в этом.
    Архив из книги сам по себе имеет некоторые ограничения, из-за чего я не могу для всех действий использовать 7z. В частности, не получается заменить файл нигде, кроме корня архива, а, если его поместить в архив и потом переименовать/перенести на нужное место, то там создаётся 2я папка-ссылка на основную (с тем же названием) и книга после таких манипуляций требует восстановления при открытии.
    Также, я не могу использовать Shell32 для всех операций, т.к. удаление и замена вызывают окно подтверждения, которое не убрать опциями.
    Сейчас я использую 7z для распаковки нужных мне файлов и удаления их их архива. Для переноса/копирования этих файлов обратно на место я использую Shell32.
    Оптимизма добавили API (они могут очень многое и очень быстро), но пока ничего не вышло.

    У Delphi и других языков куда ни плюнь есть библа для работы, а на VBA практически ВСЁ нужно писать самому  :evil:
Изменено: Jack Famous - 21.05.2024 16:42:03
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
testuser написал:
надо из OEM в юникод преобразовывать
это ваще не проблема
По вопросам из тем форума, личку не читаю.
 
БМВ, может, переименуешь тему для обобщения?
Как получить ответ командной строки (Cmd) в VBA
А уж в ячейку или на лоб — дело десятое.
Изменено: Jack Famous - 22.05.2024 11:33:03
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Страницы: 1
Читают тему
Наверх