Имя пользователя:
Пароль:
 | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Слова вводимые пользователем разбить на части и присвоить переменным

Ответить
Настройки темы
CMD/BAT - Слова вводимые пользователем разбить на части и присвоить переменным

Новый участник


Сообщения: 9
Благодарности: 0

Профиль | Сайт | Отправить PM | Цитировать


Нужно запросить у пользователя ввод текста, разбить текст на части (пробел означает новая часть) и каждую часть присвоить отдельной переменной, значение которой будет являться именем файла, то есть на каждое слово будет создаваться один файл.
Слов может быть до 16 штук.
Можно через Powershell или любой другой инструмент который есть на Win10? можно даже будет скачать что-нибудь. Самое главное чтобы можно было это записать в файлик и при запуске срабатывал сценарий.
Как я это представляю:
Код: Выделить весь код
set /P project_name="Files: "
*пользователь вводит: advantages works about portfolio order call*
Код: Выделить весь код
*магический код*
*Создалось 6 файлов: advantages.html works.html about.html portfolio.html order.html call.html*

Всем спасибо за любые советы и подсказки.

P.S Еще дополнительный вопрос появился, возможно ли запускать программу из BAT и сразу закрывать окно после этого? Я знаю что можно запускать exe через start, но у меня специальная команда "code ." которая запускает программу vscode с уже открытой папкой (откуда вызвали саму программу), и после нее батник приходится закрывать вручную, либо окно закрывается когда я закрываю visual studio code.

Отправлено: 21:34, 01-08-2019

 

Аватара для YuS_2

Crazy


Contributor


Сообщения: 1235
Благодарности: 518

Профиль | Отправить PM | Цитировать


zerdox@vk,
В личке лучше не решать задачи, тут больше людей, которые всегда могут подсказать какой-либо другой вариант и возможно он будет лучшим.
В общем, примерно так:
script.ps1 - кодировка utf8
Код: Выделить весь код
param(
	[string]$path = '.',
	[string]$extension = ".html"
)

if (!(test-path $path)){
	write-host Такого пути не существует. Создаем каталог $path -for red
	md $path|out-null
}

$var = read-host "Files"
[array]$var = $var.split()
$var|%{ni -p $path -n ("$_"+$extension) -it 'file' -v @"
<section id="$_">
	<div class="content">
	
	</div>
</section>
"@
}
В свой основной батник добавляете такую строку, в нужном месте:
Код: Выделить весь код
powershell -c "&{.\script.ps1 -path '%project_name%\src\template\'}"
естественно, в том месте, в момент выполнения кода, переменная %project_name% должна существовать.
Если в этой переменной присутствует относительный путь, то во избежание различных коллизий, лучше привести путь к абсолютному, т.к. не проверял скрипт на работу с относительными путями...

Путь к скрипту powershell можно тоже заменить на абсолютный, если потребуется.

-------
scio me nihil scire. Ѫ


Последний раз редактировалось YuS_2, 03-08-2019 в 09:37.


Отправлено: 09:29, 03-08-2019 | #11



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Новый участник


Сообщения: 9
Благодарности: 0

Профиль | Сайт | Отправить PM | Цитировать


Скрытый текст



Что-то не так сделал?
Скрытый текст



Последний раз редактировалось zerdox@vk, 03-08-2019 в 09:47. Причина: добавил спойлеры


Отправлено: 09:45, 03-08-2019 | #12


Аватара для YuS_2

Crazy


Contributor


Сообщения: 1235
Благодарности: 518

Профиль | Отправить PM | Цитировать


Цитата zerdox@vk:
Что-то не так сделал? »
скрипт powershell "script.ps1" должен находиться в том каталоге, который будет текущим на момент его вызова, либо:
Цитата YuS_2:
Путь к скрипту powershell можно тоже заменить на абсолютный, если потребуется. »
да, кстати, внутри скрипта удалите $value =, это там лишнее... это были остатки от теста...

кроме того, в переменной %project_name% у Вас в наличии только имя каталога и в итоге, путь получается относительным.
Сначала необходимо привести его к абсолютному и потом подставлять в строку запуска скрипта.
Примерно так:
Код: Выделить весь код
set "abs=z:\абсолютный_путь_к_каталогам_проектов\%project_name%\src\template\"
powershell -c "&{'z:\абсолютный_путь_к_скрипту\script.ps1' -path '%abs%'}"

-------
scio me nihil scire. Ѫ


Отправлено: 11:17, 03-08-2019 | #13


Новый участник


Сообщения: 9
Благодарности: 0

Профиль | Сайт | Отправить PM | Цитировать


Цитата YuS_2:
скрипт powershell "script.ps1" должен находиться в том каталоге, который будет текущим на момент его вызова »
Понял, там ошибка в точке, не ".\", а "..\", как всегда - мелочь.

Отправлено: 14:47, 03-08-2019 | #14


Аватара для YuS_2

Crazy


Contributor


Сообщения: 1235
Благодарности: 518

Профиль | Отправить PM | Цитировать


Цитата zerdox@vk:
Понял, там ошибка в точке, не ".\", а "..\", как всегда - мелочь. »
Это не ошибка, это просто относительные пути, одна точка - текущий каталог, две точки - родительский каталог.
По Вашим скринам это можно увидеть:
Если скрипт лежит у Вас в каталоге:
Код: Выделить весь код
C:\User\1234\Desktop\projects
а на момент запуска, текущим является:
Код: Выделить весь код
C:\User\1234\Desktop\projects\test1
то при попытке запуска скрипта из этого каталога:
Код: Выделить весь код
powershell -c "&{.\script.ps1}"
естественно, powershell его не увидит, но увидит в родительском от текущего:
Код: Выделить весь код
powershell -c "&{..\script.ps1}"
В общем, как я и написал выше:
Цитата YuS_2:
во избежание различных коллизий, лучше привести путь к абсолютному »

-------
scio me nihil scire. Ѫ


Отправлено: 15:02, 03-08-2019 | #15


Новый участник


Сообщения: 9
Благодарности: 0

Профиль | Сайт | Отправить PM | Цитировать


В общем разобрался, вот результаты:
Вывод консоли

C:\Users\1234\Desktop\projects>git clone https://github.com/ZerdoX-x/project.git
Cloning into 'project'...
remote: Enumerating objects: 15468, done.
remote: Counting objects: 100% (15468/15468), done.
remote: Compressing objects: 100% (10696/10696), done.
remote: Total 15468 (delta 4201), reused 15463 (delta 4196), pack-reused 0
Receiving objects: 100% (15468/15468), 16.17 MiB | 6.92 MiB/s, done.
Resolving deltas: 100% (4201/4201), done.

C:\Users\1234\Desktop\projects>set /P project_name="Project Name is - "
Project Name is - test

C:\Users\1234\Desktop\projects>Powershell.exe -executionpolicy remotesigned -File script.ps1
Sections: a b c d


Каталог: C:\Users\1234\Desktop\projects\project\src\template


Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 03.08.2019 17:22 71 a.html
-a---- 03.08.2019 17:22 71 b.html
-a---- 03.08.2019 17:22 71 c.html
-a---- 03.08.2019 17:22 71 d.html


Каталог: C:\Users\1234\Desktop\projects\project\src\styles\sections


Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 03.08.2019 17:22 6 a.sass
-a---- 03.08.2019 17:22 6 b.sass
-a---- 03.08.2019 17:22 6 c.sass
-a---- 03.08.2019 17:22 6 d.sass



C:\Users\1234\Desktop\projects>ren "project" "test"

C:\Users\1234\Desktop\projects>ren *.psd "test".psd
Не удается найти указанный файл.

C:\Users\1234\Desktop\projects>move *.psd "test\psd"
Файл с таким именем уже существует
или не найден.

C:\Users\1234\Desktop\projects>cd test

C:\Users\1234\Desktop\projects\test>rd /S /Q .git

C:\Users\1234\Desktop\projects\test>del /F /Q psd\.gitkeep.txt src\fonts\.gitkeep.txt src\img\.gitkeep.txt

C:\Users\1234\Desktop\projects\test>powershell -Command "(gc .\src\index.html) -replace '<title>Title</title>', '<title>test</title>' | Out-File -encoding ASCII index.html"

C:\Users\1234\Desktop\projects\test>Choice /M "Download jQuery?"
Download jQuery? [Y,N]?Y

C:\Users\1234\Desktop\projects\test>If Errorlevel 2 Goto No

C:\Users\1234\Desktop\projects\test>If Errorlevel 1 Goto Yes

C:\Users\1234\Desktop\projects\test>call npm i jquery --save-dev

> node-sass@4.12.0 install C:\Users\1234\Desktop\projects\test\node_modules\node-sass
> node scripts/install.js

Cached binary found at C:\Users\1234\AppData\Roaming\npm-cache\node-sass\4.12.0\win32-x64-72_binding.node

> node-sass@4.12.0 postinstall C:\Users\1234\Desktop\projects\test\node_modules\node-sass
> node scripts/build.js

Binary found at C:\Users\1234\Desktop\projects\test\node_modules\node-sass\vendor\win32-x64-72\binding.node
Testing binary
Binary is fine

> gifsicle@4.0.1 postinstall C:\Users\1234\Desktop\projects\test\node_modules\gifsicle
> node lib/install.js

√ gifsicle pre-build test passed successfully

> jpegtran-bin@4.0.0 postinstall C:\Users\1234\Desktop\projects\test\node_modules\jpegtran-bin
> node lib/install.js

√ jpegtran pre-build test passed successfully

> optipng-bin@5.1.0 postinstall C:\Users\1234\Desktop\projects\test\node_modules\optipng-bin
> node lib/install.js

√ optipng pre-build test passed successfully
npm WARN activebox@1.0.0 No description
npm WARN activebox@1.0.0 No repository field.
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@1.2.9 (node_modules\fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@1.2.9: wanted {"os":"darwin","arch":"any"} (current: {"os":"win32","arch":"x64"})

+ jquery@3.4.1
added 935 packages from 623 contributors and audited 14350 packages in 59.608s
found 0 vulnerabilities



Код start_project.bat

git clone https://github.com/ZerdoX-x/project.git

set /P project_name="Project Name is - "

Powershell.exe -executionpolicy remotesigned -File script.ps1

ren "project" "%project_name%"

ren *.psd "%project_name%".psd
move *.psd "%project_name%\psd"

cd %project_name%

rd /S /Q .git
del /F /Q psd\.gitkeep.txt src\fonts\.gitkeep.txt src\img\.gitkeep.txt

powershell -Command "(gc .\src\index.html) -replace '<title>Title</title>', '<title>%project_name%</title>' | Out-File -encoding ASCII index.html"

Choice /M "Download jQuery?"
If Errorlevel 2 Goto No
If Errorlevel 1 Goto Yes
Goto End

:No
call npm i
Goto End

:Yes
call npm i jquery --save-dev
cd src\js\
echo //= ../../node_modules/jquery/dist/jquery.min.js > script.js
cd ..\..\
:End

code .


Код script.ps1

param(
[string]$html_path = 'project\src\template\',
[string]$sass_path = 'project\src\styles\sections\',
[string]$html = ".html",
[string]$sass = ".sass"
)

if (!(test-path $html_path)){
write-host Такого пути не существует. Создаем каталог $html_path -for red
mkdir $html_path|out-null
}
if (!(test-path $sass_path)){
write-host Такого пути не существует. Создаем каталог $sass_path -for red
mkdir $sass_path|out-null
}

$sections = read-host "Sections"
[array]$sections = $sections.split()

$sections|ForEach-Object{New-Item -p $html_path -n ("$_"+$html) -it 'file' -v @"
<section id="$_">
<div class="content">

</div>
</section>
"@
}

$sections|ForEach-Object{New-Item -p $sass_path -n ("$_"+$sass) -it 'file' -v @"
#$_

"@
}


Все работает, как и ожидалось. Единственное - консоль сама не закрывается, все равно приходится после открытия vscode закрывать окно консоли вручную, нашел решение, но для меня оно к сожалению не сработало, заменив строку
Код: Выделить весь код
code .
на
Код: Выделить весь код
Start "" "C:\Users\1234\AppData\Local\Programs\Microsoft VS Code\Сode.exe" <.>\.
получаю ошибку 'отказано в доступе':
Скрытый текст



У exe'шника стоят все разрешения и у корневой папки тоже. Пробовал запускать bat с правами администратора, или через cmd (тоже с правами администратора) - результат один. Тут скорее всего проблема в настройках винды, а не в программе которую я пытаюсь запустить. Возможно есть идеи?

Отправлено: 15:35, 03-08-2019 | #16


Аватара для YuS_2

Crazy


Contributor


Сообщения: 1235
Благодарности: 518

Профиль | Отправить PM | Цитировать


Цитата zerdox@vk:
получаю ошибку 'отказано в доступе': »
А там точно исполняемый файл начинается на кириллический символ "С" (0x0421) ?
Code.exe и Сode.exe - это два разных файла, если что.

-------
scio me nihil scire. Ѫ

Это сообщение посчитали полезным следующие участники:

Отправлено: 15:49, 03-08-2019 | #17


Новый участник


Сообщения: 9
Благодарности: 0

Профиль | Сайт | Отправить PM | Цитировать


Цитата YuS_2:
Code.exe и Сode.exe - это два разных файла »
Поменял.. Скопировал путь прямо из проводника, теперь там буква C точно, но результат не изменился.
Еще смущает что в консоли
Код: Выделить весь код
Start "" "C:\Users\1234\AppData\Local\Programs\Microsoft VS Code\Code.exe"  0<. 1>\.
а не
Код: Выделить весь код
Start "" "C:\Users\1234\AppData\Local\Programs\Microsoft VS Code\Code.exe" <.>\.
как я прописал..
Или это нормально, раз вы ничего не сказали по этому поводу?
Могу лишь догадываться что проблема снова в кодировке. Я готов пожертвовать первой строчкой и вставить туда какой-нибудь символ, если oem 866 уже не подходит)

Отправлено: 16:12, 03-08-2019 | #18


Ветеран


Сообщения: 27449
Благодарности: 8088

Профиль | Отправить PM | Цитировать


Цитата zerdox@vk:
Еще смущает что в консоли
Код: Выделить весь код
Start "" "C:\Users\1234\AppData\Local\Programs\Microsoft VS Code\Code.exe"  0<. 1>\.
»
0 — это stdin, 1 — это stdout (стандартные потоки, Standard streams - Wikipedia). Это нормально. Так и должно быть на Ваше:
Цитата zerdox@vk:
Код: Выделить весь код
Start "" "C:\Users\1234\AppData\Local\Programs\Microsoft VS Code\Code.exe" <.>\.
»
Нахрена зачем там нужны «<» и «>» — другой вопрос.
Это сообщение посчитали полезным следующие участники:

Отправлено: 17:23, 03-08-2019 | #19


Новый участник


Сообщения: 9
Благодарности: 0

Профиль | Сайт | Отправить PM | Цитировать


Цитата Iska:
зачем там нужны «<» и «>» — другой вопрос. »
Какой раз уже благодарю вас! В ответе на stackoverflow было написано "<path_to_dir>", я подумал что между "<" и ">" нужно было писать путь, вот я и написал корневую директорию, но когда стер понял что ".\." это то же самое что и ".", поэтому стер после пути "\." и получилось вот это:
Код: Выделить весь код
Start "" "C:\Users\1234\AppData\Local\Programs\Microsoft VS Code\Code.exe" .
В общем это тот же самый "code ." но с прямым путем до файла.
Странно, как редактор кода понимает то, что ему передали через консоль? Это как-то предусмотрено в самой программе? У меня были мысли просто так-же запустить exe через старт и после пути к приложению добавить точку как аргумент который принимается за путь (точно так же как в команде "code .") но я посчитал это глупой идеей. Да и в любом случае я бы не догадался до "пустых" кавычек перед путем, фиг его знает что это означает, в комментарии кстати писали на stackoverflow что именно эта часть была упущением у кого-то.

Цитата Iska:
зачем там нужны «<» и «>» — другой вопрос. »
Какой раз уже благодарю вас! В ответе на stackoverflow было написано "<path_to_dir>", я подумал что между "<" и ">" нужно было писать путь, вот я и написал корневую директорию, но когда стер понял что ".\." это то же самое что и ".", поэтому стер после пути "\." и получилось вот это:
Код: Выделить весь код
Start "" "C:\Users\1234\AppData\Local\Programs\Microsoft VS Code\Code.exe" .
В общем это тот же самый "code ." но с прямым путем до файла.
Странно, как редактор кода понимает то, что ему передали через консоль? Это как-то предусмотрено в самой программе? У меня были мысли просто так-же запустить exe через старт и после пути к приложению добавить точку как аргумент который принимается за путь (точно так же как в команде "code .") но я посчитал это глупой идеей. Да и в любом случае я бы не догадался до "пустых" кавычек перед путем, фиг его знает что это означает, в комментарии кстати писали на stackoverflow что именно эта часть была упущением у кого-то.

Отправлено: 17:43, 03-08-2019 | #20



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Слова вводимые пользователем разбить на части и присвоить переменным

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Присвоить переменным значения имен файлов в папке kopbetby Скриптовые языки администрирования Windows 5 10-10-2016 14:26
Прочее - Разбить архив на части venuko Общий по Linux 12 30-06-2015 09:38
VBS/WSH/JS - поиск слова в тексте и вывод части текста после искомого слова sergey23031978 Скриптовые языки администрирования Windows 9 18-02-2015 16:54
Как разбить страницу на части? alturgrey Вебмастеру 13 09-08-2010 16:29
[решено] Разбить mp3 на части samurai Видео и аудио: обработка и кодирование 3 08-01-2009 12:10




 
Переход