Страницы

Поиск по вопросам

Показаны сообщения с ярлыком cmd. Показать все сообщения
Показаны сообщения с ярлыком cmd. Показать все сообщения

понедельник, 24 февраля 2020 г.

Какой командой можно запустить обычное приложение, как службу Windows?

#c_sharp #cmd


Как создать, зарегистрировать новую службу Windows из обычного приложения и поставить
его в автозагрузку?
У этого приложения будут права администратора?
    


Ответы

Ответ 1



Есть программа обертка для таких целей: https://github.com/kohsuke/winsw По сути она просто запустит приложение с нужными параметрами. При остановке службы опять же запустит его, с другими параметрами. Права у приложения будут LOCAL_SYSTEM, но это можно изменить в свойствах службы.

Ответ 2



Можно через консоль, т.е создаешь внутри программы процесс консоли и посылаешь ему что-то типа этого: Sc create MyService binPath=C:\MyService\MyService.exe DisplayName=″My New Service″ type=own start=auto Служба так же автоматом добавится в автозапуск. Подробнее тут Еще есть Installutil, но если не ошибаюсь, то у него меньше возможностей чем у SC...

Ответ 3



Есть такая программка - XyNtService с исходниками. Я ее допиливал. Здесь исправленная и улучшенная версия (с исходниками). На OneDrive - там два файла: XYNTServiceProject_src.zip и XYNTServiceProject_v03.zip

Ответ 4



Произвольное приложение запустить как службу Windows нельзя, оно должно соответствовать требованиям службы. Можно сделать простую службу, которая будет запускать и контролировать произвольное приложение, указанное в параметрах например. Чтобы не сильно страдать при создании службы, можно воспользоваться, например, TopShelf, который доступен из NuGet, и свести работу к минимуму. Права которые будут у службы настраиваются, и могут быть любыми от системных до пользовательских. При необходимости, права могут быть изменены без переустановки службы, но с обязательным перезапуском.

пятница, 14 февраля 2020 г.

Как запустить powershell в определенной папке

#windows #cmd #powershell


Создал ярлык powershell консоли в Windows 10, хочу чтобы она запускалась от администратора
и в определенной папке. Подскажите как сделать? 

Я пробовал параметр запуска указывать, не работает: 

%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe -commnad 'cd F:\'


Также не работает рабочая папка в свойствах ярлыка: 

    


Ответы

Ответ 1



Используйте PowerShell Profiles: Находясь в Powershell дайте команду на создание профиля: New-Item -ItemType file -Path $profile -Force Откройте профиль на редактирование: Ise $profile Впишите в открывшемся редакторе команду перехода в нужный каталог: cd F:\ Закройте консоль Powershell и попробуйте открыть снова. Вуаля - вы в папке f:\! PS Статьи в помощь: Профили в PowerShell All About PowerShell Profiles

Ответ 2



В проводнике Windows перейдите в адресную строку (Alt + D или Ctrl + L). Введите powershell или powershell_ise и нажмите Enter.

Ответ 3



Заходите в папку, зажимаете клавишу shift + правую кнопку мыши и затем в контекстном меню нажимаете Открыть окно команд (или, наверное будет по другому написано - Открыть Powershell).

Ответ 4



Для powershell Core pwsh.exe -wd "c:\your_directory" Для powershell version <=5.1 (встроенная в windows) Команда для реестра или при непосредственном запуске powershell powershell -NoExit -command {Set-Location -Path "c:\your_directory"} Команда для "cmd подобных" ярлыки, запуск через bat файлы и другие варианты powershell -NoExit -Command "& {Set-Location -Path \"c:\\your_directory\"}" или powershell -NoExit -Command "& Set-Location -Path \"c:\\your_directory\"" или powershell -NoExit -Command Set-Location -Path "c:\your_directory" Для ярлыка конкретно "absolute_path\powershell.exe" -NoExit -Command "& {Set-Location -Path \"c:\\your_directory\"}" Запуск от имени администратора, правая клавиша мыши - Запуск от имени администратора. Если хотите чтобы ярлык запускал сразу как от имени администратора, то свойства ярлыка=>дополнительно=>запуск от имени администратора или копайте в сторону команды runas и объединяйте команды.

Ответ 5



Можно, конечно, переписывать, но в первой ссылке первый ответ, которым я воспользовался. Редактирование реестра тоже помогло, пробовал https://stackoverflow.com/questions/183901/how-do-i-start-powershell-from-windows-explorer https://www.iguides.ru/main/os/kak_otkryt_powershell_v_tekushchey_papke/

среда, 5 февраля 2020 г.

1. Как с помощью bat файла узнать где лежит этот файл? 2. Как задать системную переменную в cmd, которая не исчезнет после перезагрузки?

#windows #cmd #bat



Как с помощью bat файла узнать где лежит этот файл?

Бат файл выполняет python скрипт, но при запуске его, он начинает путь с c:\User\
а, надо чтобы запускался с места где лежит байт файл, причем все это должно быть не
жестко привязано.
Как задать системную переменную в cmd, которая не исчезнет после перезагрузки?

При вводе Set path = %path%variable в системную перемену добавляется строка variable,
но после перезагрузки системы она исчезает. Как сделать чтобы не исчезала?

    


Ответы

Ответ 1



Нулевым параметром в любой bat-файл передается путь к нему. Применение модификатора позволяет получить папку: echo %~dp0 Добавить запись в реестр: % reg add HKCU\Environment /v VariableName /t REG_SZ /d "Variable value" Переменная станет видимой после следующего входа в систему.

Ответ 2



По второму вопросу запись в реестр вручную неудобен, т.к. изменение не действует на текущий сеанс. Ответ в команде: setx /? С учетом замечаний дополню ответ. Необходимо воспользоваться в скрипте двумя командами. Первая записывает параметр в реестр для будущих сеансов. Вторая команда задает значение параметра для текущего сеанса. @setx var0 Value @set var0=Value

воскресенье, 2 февраля 2020 г.

Как запустить .bat файл в бэкграунде?

#cmd #bat


Имеется .bat файл, который при запуске начинает выполнять различные действия в command
line. Есть ли возможность сделать так чтоб функционал .bat файла выполнялся, но при
этом чтоб сам comand line был в бэкграунде ( вернее говоря чтоб пользователь не видел,
разве что только в TaskManager ) ?
    


Ответы

Ответ 1



Средствами командного процессора этого сделать нельзя. Но можно, например, запустить процесс в скрытом окне, используя запускающий VSB-скрипт... хотя разумнее весь батч переписать на VBS или PS. UPD: По просьбе ТС подробнее. Создай на диске C: каталог \Temp. Создай в нём 2 файла. A.BAT ping -n 1000 127.0.0.1 > c:\temp\ping.txt B.VBS Set WshShell = WScript.CreateObject("WScript.Shell") WshShell.Run "C:\Temp\a.bat",0 Открой Диспетчер задач, перейди на вкладку "Процессы". Запусти файл b.vbs на исполнение (просто двойной клик по нему). Убедись, что: В процессах появятся, и через некоторое время исчезнут cmd.exe и ping.exe. В каталоге появится файл ping.txt, и, пока не завершатся процессы по п. 1, файл будет заблокирован. В файле сохранён протокол работы утилиты ping. Ни окно CMD, ни окно PING на панели задач не появляется. И можно не спешить скакать по окнам, пинг будет работать минут 10-15...

Ответ 2



Воспользуйтесь дополнительной программой cmdow https://ritchielawrence.github.io/cmdow/ cmdow /run /hid myprog.bat

Перенаправление вывода терминала в переменную

#python #cmd


Помогите разобраться с перенаправлением вывода cmd в переменную, т.к. переменной
присваивается только exit_code процесса. Для наглядности есть пара примеров:
Пример

import sys, os 
command = "tasklist"
result1 = os.system(command)
print(result1) # на выходе получим 0


Пример 2  

command = "tasklist>temp.txt"
result2 = os.system(command)
print(result2) # на выходе получим 0
with open('temp.txt', 'r') as f:
    result2 = f.read()
    print(result2) # выведет результат выполнения tasklist


Вопрос: можно ли перенаправить вывод терминала windows не используя temp.txt файл,
тобиш сразу выгружать значение в переменную.? sys.stdout пробовал.

sys.stdout = open('temp.txt', 'w') #запишет 0 в файлик 
os.system('tasklist') #сам резульат выполнения будет выведен в интеретаторе

file = open('temp.txt', 'r').read()
print(file)# выведет 0

    


Ответы

Ответ 1



subprocess.check_output() — это самый простой способ получить вывод внешней команды: import subprocess output = subprocess.check_output(['программа', 'аргумент 1', '2']) Всё что программа выводит в стандартный вывод, сохраняется в output. Если программа завершится с ненулевым статусом возврата (как правило на ошибку указывает), то check_output() выбросит исключение (не следует неявно ошибки игнорировать). Начиная с простого случая существует множество вариаций. К примеру, чтобы получить объединённый вывод как из стандартного потока команды (stdout) так и из потока ошибок (stderr), можно передать stderr=subprocess.STDOUT параметр в check_output(). Дочерний процесс может вообще напрямую в терминал писать в обход своих stdout/stderr, в этом случае на POSIX системах можно pty создать, чтобы перехватить вывод (в таких случаях удобно pexpect модуль использовать). По умолчанию вывод возвращается в виде байт, чтобы получить текст необходимо указать кодировку символов, которая может зависеть от выбранной команды: text = subprocess.check_output(['программа', 'аргумент 1', '2'], encoding=encoding) Подробнее см. Byte при печати вывода внешней команды. Стоит упомянуть, что в отличии от старых интерфейсов, унаследованных из Си (таких как system(), popen()), функции в subprocess модуле никогда не запускают командную оболочку, если явно об этом не попросить. Что позволяет избежать shell injection и делает вызов более переносимым (если сама программа переносима).

Ответ 2



Самый простой способ перенаправить вывод из системной оболочки - это подключиться к каналу команды, вот таким образом: import os command = 'dir' pipe = os.popen(command) print(pipe.read()) Здесь мы открыли канал и получили объект открытого файла из которого можно читать или писать в него в зависимости от режима (r по умолчанию) открытия, используя стандартный интерфейс работы с файлами.

Ответ 3



При накоплении целой кучи батников, для записи разных стримов, пришла в голову идея, автоматизировать процесс контроля за работой этих батников. Скрипт, который будет контролировать запуск и перезапуск в случае краша, мониторинг работоспособности, добавления новых стримов и оповещать в случае изменений, либо ошибок в любом из батников. Теперь собственно для чего был задан вопрос. ffmpeg иногда ругается на прямые ссылки на стримы, поэтому предварительно их нужно обрабатывать с помощью youtube-dl. Можно конечно писать все стримы youtube-dl, а потом разбивать готовые файлы на части, но они будут недоступны для просмотра во время записи. # _*_coding: utf-8 _*_ import os, time, subprocess, re from mylib import get_current_date_time, get_file_name, send_mail from config import EXIT_CODES, STREAMS_LIST BASE_DIR = os.path.dirname(os.path.abspath(__file__)) FFMPEG_PATH = os.path.join(BASE_DIR, 'ffmpeg\\bin', 'ffmpeg.exe') YOUTDL_PATH = os.path.join(BASE_DIR, 'youtube-dl', 'youtube-dl.exe') DEST_DIR = r'D:\test_dir' if __name__ =='__main__': video_link = 'https://www.youtube.com/watch?v=GiBK0z6Zdf4' dirty_link= subprocess.check_output('{0} -f "bestvideo[height<=480]+bestaudio/best[height<=480]" -i "{1}" -g'.format(YOUTDL_PATH, video_link)) flink_compr = re.compile(r'http.*\\n') FILE_NAME = get_file_name() out_file = os.path.join(DEST_DIR, FILE_NAME) dl_link = link_pattern.findall(str(dirty_link))[0].rstrip() command = '{0} -i "{1}" -c:v copy -vsync 1 -acodec mp2 -ac 2 -ab 128k -ar 44100 "{2}.ts"'.format(FFMPEG_PATH, dl_link, out_file) os.system(command) UPD. Это кусочек тестового примера, через subprocess. Пример с os.popen, также работает. Но я решил уйти от батников, буду пытаться запустить несколько потоков. Удачи мне, вам всем огромнейшая благодарность )))

вторник, 28 января 2020 г.

Копирование нескольких файлов через командную строку в windows

#windows #cmd #файловая_система


На linux скопировать, скажем два файла, можно с помощью команды cp просто написав
эти файлы через пробел и прописав путь куда эти они копируются. 
Пример: cp file1.txt index.html C:\new_folder

А как это сделать в cmd windows?
Команда copy копирует один файл, а два файла записанные через пробел вызывают ошибку.

Как это можно сделать? Как должна выглядеть такая команда?
    


Ответы

Ответ 1



Вы можете воспользоваться командой robocopy. Больше примеров есть тут. Пример использования: robocopy source\folder dest\folder file1.txt index.html

Ответ 2



В Windows есть PowerShell -- оболочка с интерфейсом командной строки и сопутствующего языка сценариев. Копировать файл можно так Copy-Item c:\scripts\test.txt c:\test Копировать папку с файлами и всеми подпапками так Copy-Item c:\scripts c:\test -recurse у Copy-Item есть alias'ы: cpi, cp, copy Описание тут.

Ответ 3



В 2016 году для запуска UNIX-команд и утилит в Windows рекомендуют воспользоваться Cash. Быстрая установка, Команды точно такие же, как и на UNIX-подобных ОС, не нужно переучиваться, Возможность комбинирования команд различных операционных систем. Устанавливаем Node.js, если ещё нет, → в командной строке Windows вводим npm install cash-global -g → ждём, пока установится, → тестируем команды для Linux прямо там же, в Cmd.exe. Список поддерживаемых Cash команд, небольшой обзор Cash на русском языке. Чтобы применять команды alias, clear, export, false, kill, source, true и unalias на август 2016 потребуется предварительно вводить cash, пример: E:\Киролайна>alias sl=ls "alias" не является внутренней или внешней командой, исполняемой программой или пакетным файлом. E:\Киролайна>cash SashaGoddess@DESKTOP-0G54NVG:E/Киролайна$ alias sl=ls SashaGoddess@DESKTOP-0G54NVG:E/Киролайна$ Все остальные поддерживаемые команды работают и без cash. Для копирования нескольких файлов после установки Cash достаточно ввести в интерпретатор командной строки то же самое: cp file1.txt index.html C:\new_folder.

пятница, 24 января 2020 г.

Как в винде обрезать файл до нужного размера?

#windows #cmd #bat


Именно обрезать, а не скопировать частично. Соответственно, у винды нет богатых инструментов
на все случаи жизни, как например во фре:
truncate file.goy

Нужна такая штука для теста из-под MSBiuld скрипта.     


Ответы

Ответ 1



Вот для скрипта не знаю, а для Си (MinGW gcc) есть функция ftruncate(), позволяющая урезать файл. Простейшая программулька: #include #include #include main (int ac, char *av[]) { if (ac < 3) { fprintf (stderr,"Invalid usage\nUse: truncate SIZE FILE\n"); exit (1); } off_t size = atoi(av[1]); if (size < 0) // здесь можно что-то другое, например с конца файла size = 0; FILE *f = fopen(av[2],"r+"); if (!f) { perror(av[2]); exit (-1); } if (ftruncate(fileno(f), size)) { perror("truncate"); exit (-1); } exit (0); }

суббота, 11 января 2020 г.

Как из скрипта python передать в запущенную командную строку текст?

#python #cmd


Через скрипт питона запускаю exe-файл, который выполняется в консоли и по окончанию
работы спрашивает пользователя "Продолжить (y - да, n - нет)"

Как мне через скрипт питона уже в запущенную консоль ввести текст? например в моем
случае символы - y или n?
    


Ответы

Ответ 1



С помощью subprocess.Popen, можно так: from subprocess import Popen, PIPE process = Popen(['app.exe'], stdout=PIPE, stdin=PIPE, stderr=PIPE) stdout_data = process.communicate(input='y')[0] Если вам необходимо дождаться окончания работы, а затем написать y/n, то перед communicate добавьте этот цикл: while True: line = process.stdout.readline() if line == '': break

пятница, 10 января 2020 г.

Сборка проекта С++/С# из командной строки

#cmd #visual_studio_2015 #build


Требуется собрать проект с помощью bat-файла. Параметры сборки следующие:

MsVstudio\incredibuilder - тип сборки локальная\распределенная
win32\x64
debug\release
build\rebuild


Можно ли как-то при запуске VS передать в неё такие параметры? Читал про команду
devenv, она даёт возможность только указать Build или Rebuild.
    


Ответы

Ответ 1



Вам нужен MSBuild - это утилита от Майкрософта, которая умеет с командной строки собирать проекты. А вот прикрутить ее в бат файл - это уже простая задача. Как собрать проект в релизе? MSBuild.exe C:\Folder with Solution\My Solution.sln /property:Configuration=Release как собрать и дебаг, и релиз? MSBuild.exe C:\Folder with Solution\My Solution.sln /property:Configuration=Debug;Release Хочется чего то больше - читаем документацию https://msdn.microsoft.com/ru-ru/library/ms164311.aspx P.S. Возможно, придется запускать "VS2015 x86 Native Tools Command Prompt" (ну или под Вашу версию студии) и в его консоли уже выполнять сборку.

Ответ 2



В общем локальная сборка делается с помощью MSBuild, как мне посоветовали выше. Полный пример: msbuild.exe %SolutionPath% /t:build /p:configuration=release /p:platform=x86 Запускается из Bat, только после перехода в каталог, в котором находится MSBuild. Распределённая сборка, через IncrediBuild, делается через BuildConsole: BuildConsole.exe %SolutionPath% /build /cfg="release|x86" Является командой самой windows cmd, так что ничего придумывать не надо.

четверг, 2 января 2020 г.

Запуск окна командной строки со встроенной командой

#cmd


Требуется, чтобы окно командной строки запустилось и сразу же началось выполнение
указанной команды.

Если точнее, хочу это проделать с ярлыком cmd.exe.

Как это осуществить?
    


Ответы

Ответ 1



Выше сказанное запустит указанную команду, однако, после её выполнения окно тут же закроется. Чую, неспроста автор хочет запустить именно cmd, подозреваю, есть желание лицезреть окно консоли даже после завершения команды. Следующий вариант запуска даст сей эффект start call ipconfig

Ответ 2



оч просто: напиши команду в notepad и сохрани с расширением .bat When a batch file is run, the shell program (usually COMMAND.COM or cmd.exe) reads the file and executes its commands, normally line-by-line. Unix-like operating systems (such as Linux) have a similar, but more flexible, type of file called a shell script. The filename extension .bat is used in DOS and Windows.

Ответ 3



К выше сказанному но на пальцах еще не забывать , что многие команды требуют прав админа , поэтому клацайте по файлику правой кнопкой и жмите "Запуск от имени админа"

вторник, 31 декабря 2019 г.

ping на java из командной строки. проблема с кодировкой

#java #кодировка #cmd


Есть такой код:

  import java.io.BufferedReader;
  import java.io.InputStreamReader;

public class PingIP {

 public static void runSystemCommand(String command) {

    try {
        Process p = Runtime.getRuntime().exec(command);
        BufferedReader inputStream = new BufferedReader(
                new InputStreamReader(p.getInputStream()));

        String s = "";
        // reading output stream of the command
        while ((s = inputStream.readLine()) != null) {
            System.out.println(s);
        }

    } catch (Exception e) {
        e.printStackTrace();
    }
}

    public static void main(String[] args) {

    String ip = "google.com";
    runSystemCommand("ping " + ip);

}

}


Сохранял файл в разных кодировках из vs studio code. Сохранение в кириллице 1251
на скриншоте. Как поправить кодировку? Cmd выводит ответы пинга на русском языке по
умолчанию. Может можно на англ поменять, но это на втором плане, хотелось бы на русском.


    


Ответы

Ответ 1



Программы, которые рассчитаны на использование в Windows в консольном режиме, по историческим причинам используют для вывода кодировку CP866, которая применялась в DOS. Java считает, что строки должны содержать Unicode. Иными словами, поток, который вы получаете от процесса p, содержит CP866, а вы обращаетесь с ним так, как будто он содержит Unicode. Открывайте поток вот так: BufferedReader inputStream = new BufferedReader(new InputStreamReader( p.getInputStream(), Charset.forName("CP866"))); и всё будет в порядке.

понедельник, 30 декабря 2019 г.

заменить строки в одном текстовом файле информацией из второго

#python #bash #perl #cmd #shell


Именются 2 гигантских текстовых файла.

file1.txt (3,6 Гб) содержит только одну колонку (в том числе много дубликатов):

123456
123456
123456
абвгд
абвгд
01щенок
01щенок
01щенок
01щенок
01щенок
a0125uß
a0125uß


file2.txt (1,5 ГБ) содержит ту же колонку, но без дубликатов плюс вторую колонку.

123456:artur
абвгд:sergey
01щенок:max
a0125uß:stasik


Задача: сравнить первые колонки в обеих  файлах и заменить одинаковые строки в первом
файле, строками из второй колонки второго файла, чтобы получилось следующее (дубликаты
в первом файле должны остаться):

artur
artur
artur
sergey
sergey
max
max
max
max
stasik
stasik


У меня есть такой код:

import io
STRFILE1 = 'file1.txt'
STRFILE2 = 'file2.txt'
STRFILERESULT = 'result.txt'
fIN = open(STRFILE1,'r')
strContent = fIN.read()
fIN.close()

with open(STRFILE2,'r') as f:
    for line in f:
        mapping = line.split(":",1)
        strContent = strContent.replace(mapping[0],mapping[1].rstrip("\n"))

fOUT = open(STRFILERESULT,'w')
fOUT.write(strContent)
fOUT.close()


но он работает вечно с таким объёмом строк (102.600.000 - файл 1 и 50.000.000 - файл
2). Как можно ускоритъ процесс обработки?
    


Ответы

Ответ 1



Если на python, то можно так: def story_key(): with open('te2', 'r') as f2: my_key = {i.split(':')[0]: i.split(':')[1].strip() for i in f2} return my_key all_key = story_key() def read_small(f_object, f_size=1024): while True: data = f_object.read(f_size) if not data: break yield data def f_write(): with open('te1') as f1: with open('te3', 'a') as f3: for i in read_small(f1): a = [all_key[j] + '\n' for j in i.split('\n') if j] f3.write(''.join(a)) f_write()

Ответ 2



Как можно ускоритъ процесс обработки? например, можно воспользоваться не языком программирования, а самыми обыкновенными gnu-утилитами join, sort, cut, nl. с большой долей вероятности это будет работать быстрее, нежели манипуляции со «словарями», или, тем более, базой данных (время на создание индекса, скорее всего, значительно превысит время, за которое отработают предлагаемые утилиты). если порядок строк не важен, то замена будет произведена довольно быстро: $ join -t : -o 2.2 <(sort файл1) <(sort файл2) max max max max max artur artur artur stasik stasik sergey sergey если порядок важен, вычислений понадобится значительно больше. что-нибудь в этом духе: $ join -t : -1 2 -o 1.1,2.2 <(nl -n rz -s ':' файл1 | sort -t ':' -k 2) <(sort файл2) | sort -n | cut -d : -f 2 artur artur artur sergey sergey max max max max max stasik stasik

Ответ 3



Ваш скрипт медленный потому что вы для каждого уникального значения создаёте 3.6GB строчку заново. Предполагая что все дубликаты подряд идут и порядок уникальных значений одинаковый в обоих файлах, можно читать файл с заменами и писать их в выходной файл столько раз, сколько текущий ключ повторяется в файле с дубликатами: #!/usr/bin/env python from itertools import groupby with open('file1.txt', 'rb') as dups_file, \ open('file2.txt', 'rb') as replacements_file, \ open('result.txt', 'wb') as output_file: groups = groupby(dups_file) for line in replacements_file: key, value = line.split(b':') dupe_key, dupes = next(groups) assert key == dupe_key.rstrip(), (key, dupe_key) for _ in dupes: output_file.write(value) Чтобы сделать код более устойчивым к неправильному вводу, в зависимости от вашей ситуации, добавьте try/except и пропускайте соответствующие строки. Для ожидаемого ввода, код как есть работает. Этот код читает по одной строчке из каждого файла за раз (минимально памяти требует O(1)). Использование 'b' режима предполагает, что текст в файлах закодирован используя одинаковые кодировки.

Ответ 4



Я не зря задавал вопрос про упорядоченность повторяющихся данных. Эту мысль подхватил @jfs и прислал практически оптимальное решение с учетом регулярности данных. Добавлю только, что основное время уходит на обработку строки: strContent = strContent.replace(mapping[0],mapping[1].rstrip("\n")) которую вы постоянно держите "в памяти". Чтобы было понятно - сколько примерно времени уходит на "ворочанье" в памяти strContent приведу близкий по смыслу код. Первый пример - почти как у вас - "все в одно": # -*- coding: utf-8 -*- from time import time fw = open('fileDict.txt',"w", buffering=4096, encoding='utf-8') out_text = '' prefix = "key" t_start = time() for i in range(10000000): out_text += prefix+str(i)+":" + str(i)+ '\n' fw.write(out_text) t_end = time() fw.close() print('work_time=', t_end - t_start ) # results: # without buffering in line #4 # 1 000 000 time 27.8 sec # 10 000 000 time 3403.8 sec # with buffering in line #4 # 1 000 000 time 26.8 sec # 10 000 000 time 3350.8 sec второй вариант - запхнем кусочками в список: from time import time fw = open('fileDict.txt',"w",encoding='utf-8') out_text = '' prefix = "key" out_list = [] t_start = time() for i in range(10000000): out_list.append( prefix+str(i)+":" + str(i)+ '\n' ) t_middle = time() for line in out_list: fw.write(line) t_end = time() fw.close() print('work_time=', t_end - t_start, "parsing time:", t_middle-t_start, \ " + writing_time: ", t_end - t_middle ) # results: # 1 000 000 time 2.2 sec # 10 000 000 time 21.8 sec печать для 1 000 000: work_time= 2.2221806049346924 parsing time: 1.2595593929290771 + writing_time: 0.9626212120056152 печать для 10 000 000: work_time= 21.796194791793823 parsing time: 12.18700361251831 + writing_time: 9.609191179275513 Из чего следует, что представление обрабатываемых данных вашим программистом было выбрано не лучшим образом. Действительно разница в обработке как 3340 к 12 ... на построении данных для файла в 10 млн строк размером почти 200Мб

Как заменить PowerShell в контекстном меню на командную строку?

#windows #cmd #консоль #powershell #командная_строка


Переустановил Windows и пропала командная строка из контекстного меню.
SHIFT+Right Button тоже ничего не дает, там только PowerShell, как его заменить?  


    


Ответы

Ответ 1



1) Добавление cmd в контекстное меню (оригинальная cтатья) Нажмите клавиши Win + R и введите regedit для запуска редактора реестра. Перейдите к разделу реестра HKEY_CLASSES_ROOT\Directrory\shell\cmd, нажмите правой кнопкой мыши по имени раздела и выберите пункт меню «Разрешения». В следующем окне нажмите кнопку Дополнительно. Нажмите Изменить рядом с пунктом «Владелец». В поле «Введите имена выбираемых объектов» введите имя вашего пользователя и нажмите Проверить имена, а затем — Ок. Примечание: если используется учетная запись Майкрософт, введите адрес электронной почты вместо имени пользователя. Отметьте пункт «Заменить владельца подконтейнеров и объектов» и «Заменить все записи разрешений дочернего объекта», затем нажмите Ок и подтвердите действие. Вы вернетесь в окно параметров безопасности раздела реестра, в нем выберите пункт «Администраторы» и установите отметку «Полный доступ», нажмите Ок. Вернувшись в редактор реестра, нажмите по значению HideBasedOnVelocityId (в правой части редактора реестра) правой кнопкой мыши и выберите пункт «Удалить». Повторите шаги 2-8 для разделов HKEY_CLASSES_ROOT\Directrory\Background\ shell\cmd и HKEY_CLASSES_ROOT\Drive\shell\cmd Результат при shift + right click`: 2) Замена PowerShell в win + x меню Откройте контекстное меню на панели задач и выберите пункт Параметры панели задач В появившемся меню отключите пункт Заменить командную строку оболочкой Windows PowerShell... Результат при win + x:

воскресенье, 29 декабря 2019 г.

Возможно ли программно определять IP адрес в C#?

#c_sharp #ip #cmd


Возможно ли определить свой IP через программу на C# ? Желательно локальный IP и
внешний. И, если возможно узнавать, через роутер, то как ? Можете подсказать в каком
направлении копать или пример кода продемонстрировать мне ?     


Ответы

Ответ 1



Возможно: foreach (System.Net.IPAddress ip in System.Net.Dns.GetHostByName(System.Net.Dns.GetHostName()).AddressList) { Console.WriteLine(ip.ToString()); } Это локальные адреса

Ответ 2



Внешний IP никто кроме роутера не знает, поэтому единственный способ его узнать, спросить у кого-то за роутером свой IP, например тут http://www.myip.ru/ru-RU/index.php

суббота, 28 декабря 2019 г.

BAT-Синтаксис

#bat #cmd


Допустим в батнике:

cd C:\Program Files\path\test\  
start someprg.exe

Как после выполнения этих команд вернуться обратно в директорию к батнику, где бы
он не находился?    


Ответы

Ответ 1



На самом деле оба предложенных решения возвращают запомненную рабочую директорию, что не соответствует буквальному условию задачи: вернуться обратно в директорию к батнику, где бы он не находился Сменить директорию на ту, в которой расположен батник, можно так: CD /D A:\SOME\ REM делаем что-либо с относительными путями CD /D "%~dp0"

Ответ 2



См. help set в cmd set curdir=%cd% cd c:\ushare dir cd %curdir% Что-то в таком духе.

Ответ 3



Иногда может быть полезным воспользоваться командами PUSHD (переход в папку и запоминание старой) и POPD (возврат в запомненную папку) PUSHD папка REM Что-то полезное делаем POPD

Ответ 4



Лучше всего в данном случае использовать переменные: set up=%cd% Rem здесь тело батника cd %up%

пятница, 27 декабря 2019 г.

Как отличить понятия ключ, параметр и опция в cmd?

#cmd


Как отличить понятия ключ, параметр и опция в командной строке?
    


Ответы

Ответ 1



Различие чисто функциональное. Технически,- как уже было отмечено, - это одно и то же. Параметр - это взгляд изнутри утилиты (или скрипта) вызываемой командной строкой. То есть это то, что является частью командной строки и может быть использовано утилитой. Так сказать, взгляд программиста на входные данные программе. Ключ - это директива утилите, указывающая по какой подпрограмме действовать, какой функционал использовать. Это взгляд со стороны пользователя утилиты. Опция - тоже что и ключ, но принципиальное значение тут имеет то, что опция подразумевает многовариантность. Т.е. опция может быть указана, а может и нет, и имеет место быть их множество. Это тоже взгляд со стороны пользователя. И, наконец, ещё раз о параметре. С точки зрения пользователя - это есть значение для опции(ключа). Т.е. утилита может работать совместно с опцией указывающей по какой подпрограмме работать, где входными данными будут служить значения параметра ключа.

вторник, 24 декабря 2019 г.

Как вместо cmd сделать PowerShell Windows 10?

#cmd #windows_10 #powershell


Появилась проблема, почему-то, когда нажимаю Shift + ПКМ в нужной мне папке могу
открыть только обычную консоль cmd, а мне нужно именно PowerShell. Раньше был PowerShell,
потом долго не работал с ним, а теперь у меня cmd, ну, видимо,  

  

я что-то наклацал:) Помогите пожалуйста :D
    


Ответы

Ответ 1



я вспомнил, что в Visual Studio Code(я там работаю) есть возможность создать терминал, один из которых и есть powershell, открываеться сразу в нужной мне папке, так что, уже всё нормально.

понедельник, 23 декабря 2019 г.

error: cannot spawn git: Function not implemented

#windows #git #cmd


Я на хероку хочу закинуть своего бота и вот когда пишу 

 git push heroku master 


выводит

 error: cannot spawn git: Function not implemented


Как это решить ?

Версия гит 2.16.1, ОС--Windows7 x64 
    


Ответы

Ответ 1



Это баг в свежем обновлении дистрибутива, проявляется на 2.16.1 и 2.16.2 Об этом же пишут коллеги на en so и уже появлся issue на гитхабе. Либо ждите исправления, либо временно установите более раннюю версию. Если есть аккаунт на гитхаб – можете в том issue указать, что проблема воспроизводится не только на Windows Server 2008, но и на вашей Windows 7 x64.

воскресенье, 22 декабря 2019 г.

Возможно ли получить текст из cmd после Process.Start?

#c_sharp #cmd


Можно ли получить текст из cmd после ... 

Process _process = new Process ();

ProcessStartInfo startInfo = new ProcessStartInfo();


startInfo.FileName = "filename";
startInfo.Arguments = "/p /a /c" ;

_process.StartInfo = startInfo;
_process.Start();


Попробовал как вы посоветовали но выскакивает ошибка как вы думаете, как можно исправить?


Самое интересное, что вызов срабатывает ...

    


Ответы

Ответ 1



Если речь о получении вывода консольной команды, то попробуйте следующий подход: startInfo.FileName = "filename"; startInfo.Arguments = "/p /a /c"; startInfo.UseShellExecute = false; startInfo.RedirectStandardOutput = true; _process.StartInfo = startInfo; _process.EnableRaisingEvents = true; _process.OutputDataReceived += process_OutputDataReceived; _process.Exited += process_Exited; _process.Start(); Остается только написать обработчики process_OutputDataReceived и process_Exited. Если выхлоп у процесса небольшой и быстрый, то можно просто добавить startInfo.UseShellExecute = false; startInfo.RedirectStandardOutput = true; А потом прочитать весь вывод: string output = _process.StandardOutput.ReadToEnd();

Ответ 2



ChDir("D:\Некий Путь") Dim Info As New ProcessStartInfo With {.FileName = "cmd.exe", .Arguments = "/k ""smth.bat""", .RedirectStandardOutput = True, .RedirectStandardError = True, .UseShellExecute = False, .CreateNoWindow = True} Dim Prc As Process = Process.Start(Info) Do Dim Line As String = Await Prc.StandardOutput.ReadLineAsync() If Line Is Nothing Then Exit Do RtbStart1.Text += Line + vbCrLf Loop

суббота, 21 декабря 2019 г.

Изменить COM-порт устройства программно

#cpp #c #windows #cmd #com_порт


У меня подключено устройство (arduino), оно определяется и подключается к какому-нибудь
COM-порту. Номер порта можно изменить через Устройства и принтеры > свойства > изменить.
А возможно ли это сделать с помощью C/C++, или, на крайний случай, через консоль?
    


Ответы

Ответ 1



Как я вижу проблему (могу видеть её не полностью, так как лет двадцать уже не работал с железом на низком уровне): есть два варианта, через которые можно её решать: через Driver SDK или по принципу "нормальные герои всегда идут в обход". Driver SDK никогда не любил, хотя и приходилось, плюс это не интересно и не спортивно :) А вот запросить WMI, поковыряться в реестре и обновить ручками ComDB - гораздо интереснее: Лезем в реестр по адресу HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\COM Name Arbiter. Видим: Я даже не ожидал, что у меня в системе есть хотя бы один COM-порт. А он есть, и именно один. Каждый байт в параметре ComDB отвечает сразу за 8 портов (бит на каждый): "0101 1011" |||| ||||____ Com1 используется |||| |||_____ Com2 используется |||| ||______ Com3 не используется |||| |_______ Com4 используется ||||_________ Com5 используется |||__________ Com6 не используется ||___________ Com7 используется |____________ Com8 не используется Т.е. нам понадобится поменять нужные биты. Это раз. Ну, и второе: залезть в реестр по адресу HKLM:\SYSTEM\CurrentControlSet\Enum\, найти там наш девайс и перепривязать новый порт, меняя при это имя. Где-то в недрах моих архивов лежит почти готовое решение на Delphi. Если надо, постараюсь найти или написать заново, уж перевести на C++ труда не составит :) Ну, либо вот решение для консоли, а именно для powershell. В нём вроде бы всё понятно, можно сразу переводить на C++, я ещё не знаю, как в нём работать с битами. Проверить у себя не могу, т.к. нет ни одного устройства, которое бы работало с COM-портом, а злобная Windows 10 удаляет эмуляторы. $DeviceName = "My Arduino" $ComPort = "COM1" function Change-ComPort { Param ($Name,$NewPort) #Запрашиваем через WMI наш девайс $Query = 'Select * from Win32_PnPEntity where Description = "' + $Name + '"' $Device = Get-WmiObject -Query $Query #Выполняем только, если девайс присутствует в системе if ($Device) { #Берем информацию о нём $DeviceKey = "HKLM:\SYSTEM\CurrentControlSet\Enum\" + $Device.DeviceID $PortKey = "HKLM:\SYSTEM\CurrentControlSet\Enum\" + $Device.DeviceID + "\Device Parameters" $Port = get-itemproperty -path $PortKey -Name PortName $OldPort = [convert]::ToInt32(($Port.PortName).Replace("COM","")) #Выставляем новое значение порта и обновляем имя $FriendlyName = $Name + " (" + $NewPort + ")" New-ItemProperty -Path $PortKey -Name "PortName" -PropertyType String -Value $NewPort -Force New-ItemProperty -Path $DeviceKey -Name "FriendlyName" -PropertyType String -Value $FriendlyName -Force #освобождаем старый порт из ComDB $Byte = ($OldPort - ($OldPort % 8))/8 $Bit = 8 - ($OldPort % 8) if ($Bit -eq 8) { $Bit = 0 $Byte = $Byte - 1 } $ComDB = get-itemproperty -path "HKLM:\SYSTEM\CurrentControlSet\Control\COM Name Arbiter" -Name ComDB $ComBinaryArray = ([convert]::ToString($ComDB.ComDB[$Byte],2)).ToCharArray() while ($ComBinaryArray.Length -ne 8) { $ComBinaryArray = ,"0" + $ComBinaryArray } $ComBinaryArray[$Bit] = "0" $ComBinary = [string]::Join("",$ComBinaryArray) $ComDB.ComDB[$Byte] = [convert]::ToInt32($ComBinary,2) Set-ItemProperty -path "HKLM:\SYSTEM\CurrentControlSet\Control\COM Name Arbiter" -Name ComDB -Value ([byte[]]$ComDB.ComDB) } } Change-ComPort $DeviceName $ComPort Да, разумеется, права на исполнение понадобятся, в зависимости от того, как выставлены разрешения на указанные в скрипте ветки реестра.

Ответ 2



Благодарю Виктора Томилова за ответ, но у меня получилось сделать таким образом: Win32_PnPEntity WHERE ClassGuid="{4d36e978-e325-11ce-bfc1-08002be10318}" Такой запрос возвращает имена всех COM устройств, у которых в названии система прописывает номер COM-порта, остаётся только найти нужное устройство по имени и достать от туда номер порта. Вот регулярка для взятия порта из текста, если кому надо: COM\d{1,}