Показать полную графическую версию : Слова вводимые пользователем разбить на части и присвоить переменным
zerdox@vk
01-08-2019, 21:34
Нужно запросить у пользователя ввод текста, разбить текст на части (пробел означает новая часть) и каждую часть присвоить отдельной переменной, значение которой будет являться именем файла, то есть на каждое слово будет создаваться один файл.
Слов может быть до 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.
@echo off
setlocal enableextensions enabledelayedexpansion
set /p "sProjectNames=Enter project names: "
if defined sProjectNames for %%i in (%sProjectNames%) do >nul copy /y nul "%%~i.html" && echo Create file [%%~i.html].|| echo Can't create file [%%~i.html].
endlocal
exit /b 0
Option Explicit
Dim strProjectNames
Dim strProjectName
With WScript.CreateObject("Scripting.FileSystemObject")
If StrComp(.GetFileName(WScript.FullName), "wscript.exe", vbTextCompare) = 0 Then
strProjectNames = Trim(InputBox("Enter project names:", "Enter project names"))
Else
WScript.StdOut.Write "Enter project names:"
strProjectNames = Trim(WScript.StdIn.ReadLine())
End If
If Len(strProjectNames) > 0 Then
For Each strProjectName In Split(strProjectNames)
.CreateTextFile(strProjectName & ".html", True).Close
WScript.Echo "Create file [" & strProjectName & ".html]."
Next
End If
End With
WScript.Quit 0
но у меня специальная команда "code ." »
Расскажите про это подробнее.
Можно через Powershell »
$ext = ".html"
#Содержимое файлов:
$html = @'
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<script>
window.onbeforeunload = function() {
return ''
}
</script>
<SCRIPT>
function kill(){window.close ();}
</SCRIPT>
</head>
<body>
<h1>Закрой меня!</h1>
<h1>Так:</h1>
<br>
<input type=button name = Ы value = "Нажмите" onClick=kill()>
<br>
<h1>Или так:</h1>
<a href="#" onClick="parent.self.close(); return false">Закрытие страницы</a>
</body>
</html>
'@
$var = read-host "Files"
[array]$var = $var.split()
$var|%{new-item -n ("$_"+$ext) -it 'file' -v $html}
Я знаю что можно запускать exe через start »
через старт можно запускать всё, что запускаемо...
start "" cmd /c "echo здесь могли быть команды для запуска&pause"
zerdox@vk
02-08-2019, 13:49
Расскажите про это подробнее. »
Есть редактор кода Visual Studio Code, где я и работаю. У меня есть в папке проектов батник, который автоматизирует создание нового проекта, если интересно то вот его содержимое:
(
git clone https://github.com/ZerdoX-x/project.git
set /P project_name="Project Name is - "
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
del /F /Q src\fonts\.gitkeep.txt
del /F /Q src\img\.gitkeep.txt
cd src
powershell -Command "(gc index.html) -replace '<title>Title</title>', '<title>%project_name%</title>' | Out-File -encoding ASCII index.html"
cd ..\
code .
И мне нужно чтобы после последней команды окно автоматически закрывалось, а не дожидалось закрытия vscode. Команду я взял отсюда (https://code.visualstudio.com/docs/editor/command-line), из официальной документации. Вся суть в том что эта команда запускает редактор с уже открытой папкой, откуда ее запустили. Если я буду запускать просто как exe файл, командой start и тогда командная строка не будет дожидаться завершения программы, но мне придется вручную заходить в папку нового проекта. А тут я именно указываю директорию относительно места, где запустился vscode - в моем случае это корневая директория - "."
Вот когда я запускаю программу через code . - скриншот (https://screenshare.ru/9z1wGXMN)
А когда я запускаю просто как exe, у меня открывается папка в которой лежит программа.
Сейчас снова решил попробовать, вставил вместо "code ." "cmd /c start /D "C:\Users\1234\AppData\Local\Programs\Microsoft VS Code" Code.exe" и все заработало точно так-же) странно.. (я не разбираюсь что означают все эти префиксы и прочее, видимо в прошлый раз я команду брал из другого источника и что-то там было написано по другому, сам я это не пишу, все беру из интернета)
В общем проблема решилась сама собой:)
И возможно вы знаете как правильно сохранить файл чтобы мне в начале убрать эту надоедливую скобку. Я ее туда поставил из-за кодировки файла, потому что на первую команду почему-то вставляется "я╗┐"
скриншот (https://screenshare.ru/c8aWkBUR) (в самом файле нет этих символов, они именно если запускать батник появляются)
По поводу сценария, спасибо большое, все работает. Но не совсем понял куда нужно прописать путь, чтобы он клал файлы не туда откуда вызвался батник, а относительно него по пути:
"%project_name%\src\template\"
в самом файле нет этих символов, они именно если запускать батник появляются »
Это так называемый BOM, маркер последовательности байтов, по которому косвенно определяется кодировка файла. Это "невидимый" символ, который вставляют редакторы.
В общем, батники сохраняйте в кодировке cp866 (OEM) и тогда таких проблем не будет возникать.
Но не совсем понял куда нужно прописать путь, чтобы он клал файлы не туда откуда вызвался батник, а относительно него по пути »
не совсем понятно про какой сценарий речь, здесь ведь весь топик в сценариях. :)
zerdox@vk
02-08-2019, 16:02
не совсем понятно про какой сценарий речь, здесь ведь весь топик в сценариях. »
Так куда все такие прописать папку? Это окончательный мой вопрос, все остальное я понял. Спасибо всем еще раз.
zerdox@vk
02-08-2019, 16:51
просто решу это при помощи cd
Так куда все такие прописать папку? »
Если речь про мой сценарий, то вот так можно будет вводить путь к целевому каталогу:
$ext = ".html"
#Содержимое файлов:
$html = @'
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<script>
window.onbeforeunload = function() {
return ''
}
</script>
<SCRIPT>
function kill(){window.close ();}
</SCRIPT>
</head>
<body>
<h1>Закрой меня!</h1>
<h1>Так:</h1>
<br>
<input type=button name = Ы value = "Нажмите" onClick=kill()>
<br>
<h1>Или так:</h1>
<a href="#" onClick="parent.self.close(); return false">Закрытие страницы</a>
</body>
</html>
'@
#Путь к целевому каталогу:
$path = 'z:\Folder'
if (!(test-path $path)){md $path|out-null}
$var = read-host "Files"
[array]$var = $var.split()
$var|%{ni -p $path -n ("$_"+$ext) -it 'file' -v $html}
и это не батник, это сценарий powershell, здесь прописывать путь в таком виде:
"%project_name%\src\template\" »
не получится.
здесь прописывать путь в таком виде:
Цитата zerdox@vk:
"%project_name%\src\template\" »
не получится. »
А если, как в WSH, принудительно раскрывать такую строку?
[environment]::ExpandEnvironmentVariables('%SystemRoot%\System32')
А если, как в WSH, принудительно раскрывать такую строку? »
если переменную вынести в системные, то можно, но там ведь локальная переменная, которая существует только в пределах batch-сценария.
В том смысле, что powershell-у неизвестно ничего о существовании такой переменной.
Можно просто через батник вызвать powershell сценарий и там же передать сценарию значение этой переменной...
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 можно тоже заменить на абсолютный, если потребуется.
zerdox@vk
03-08-2019, 09:45
https://sun9-27.userapi.com/c858416/v858416628/3525d/OvjoSLnAWec.jpg
Что-то не так сделал?
https://pp.userapi.com/c858416/v858416628/35278/93gNiNze-Iw.jpg
Что-то не так сделал? »
скрипт powershell "script.ps1" должен находиться в том каталоге, который будет текущим на момент его вызова, либо:
Путь к скрипту powershell можно тоже заменить на абсолютный, если потребуется. »
да, кстати, внутри скрипта удалите $value =, это там лишнее... это были остатки от теста...
кроме того, в переменной %project_name% у Вас в наличии только имя каталога и в итоге, путь получается относительным.
Сначала необходимо привести его к абсолютному и потом подставлять в строку запуска скрипта.
Примерно так:
set "abs=z:\абсолютный_путь_к_каталогам_проектов\%project_name%\src\template\"
powershell -c "&{'z:\абсолютный_путь_к_скрипту\script.ps1' -path '%abs%'}"
zerdox@vk
03-08-2019, 14:47
скрипт powershell "script.ps1" должен находиться в том каталоге, который будет текущим на момент его вызова »
Понял, там ошибка в точке, не ".\", а "..\", как всегда - мелочь.
Понял, там ошибка в точке, не ".\", а "..\", как всегда - мелочь. »
Это не ошибка, это просто относительные пути, одна точка - текущий каталог, две точки - родительский каталог.
По Вашим скринам это можно увидеть:
Если скрипт лежит у Вас в каталоге:
C:\User\1234\Desktop\projects
а на момент запуска, текущим является:
C:\User\1234\Desktop\projects\test1
то при попытке запуска скрипта из этого каталога:
powershell -c "&{.\script.ps1}"
естественно, powershell его не увидит, но увидит в родительском от текущего:
powershell -c "&{..\script.ps1}"
В общем, как я и написал выше:
во избежание различных коллизий, лучше привести путь к абсолютному »
zerdox@vk
03-08-2019, 15:35
В общем разобрался, вот результаты:
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
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 .
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 закрывать окно консоли вручную, нашел решение (https://stackoverflow.com/questions/36969586/running-visual-studio-code-in-the-current-folder-with-batch-file), но для меня оно к сожалению не сработало, заменив строку
code .
на
Start "" "C:\Users\1234\AppData\Local\Programs\Microsoft VS Code\Сode.exe" <.>\.
получаю ошибку 'отказано в доступе':
https://sun9-27.userapi.com/c851524/v851524559/190e0d/Hk0uf4Vmvho.jpg
У exe'шника стоят все разрешения и у корневой папки тоже. Пробовал запускать bat с правами администратора, или через cmd (тоже с правами администратора) - результат один. Тут скорее всего проблема в настройках винды, а не в программе которую я пытаюсь запустить. Возможно есть идеи?
получаю ошибку 'отказано в доступе': »
А там точно исполняемый файл начинается на кириллический символ "С" (0x0421) ? :)
Code.exe и Сode.exe - это два разных файла, если что.
zerdox@vk
03-08-2019, 16:12
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 уже не подходит)
Еще смущает что в консоли
Start "" "C:\Users\1234\AppData\Local\Programs\Microsoft VS Code\Code.exe" 0<. 1>\.»
0 — это stdin, 1 — это stdout (стандартные потоки, Standard streams - Wikipedia (https://en.wikipedia.org/wiki/Standard_streams)). Это нормально. Так и должно быть на Ваше:
Start "" "C:\Users\1234\AppData\Local\Programs\Microsoft VS Code\Code.exe" <.>\. »
Нахрена зачем там нужны «<» и «>» — другой вопрос.
zerdox@vk
03-08-2019, 17:43
зачем там нужны «<» и «>» — другой вопрос. »
Какой раз уже благодарю вас! В ответе на stackoverflow было написано "<path_to_dir>", я подумал что между "<" и ">" нужно было писать путь, вот я и написал корневую директорию, но когда стер понял что ".\." это то же самое что и ".", поэтому стер после пути "\." и получилось вот это:
Start "" "C:\Users\1234\AppData\Local\Programs\Microsoft VS Code\Code.exe" .
В общем это тот же самый "code ." но с прямым путем до файла.
Странно, как редактор кода понимает то, что ему передали через консоль? Это как-то предусмотрено в самой программе? У меня были мысли просто так-же запустить exe через старт и после пути к приложению добавить точку как аргумент который принимается за путь (точно так же как в команде "code .") но я посчитал это глупой идеей. Да и в любом случае я бы не догадался до "пустых" кавычек перед путем, фиг его знает что это означает, в комментарии кстати писали на stackoverflow что именно эта часть была упущением у кого-то.
зачем там нужны «<» и «>» — другой вопрос. »
Какой раз уже благодарю вас! В ответе на stackoverflow было написано "<path_to_dir>", я подумал что между "<" и ">" нужно было писать путь, вот я и написал корневую директорию, но когда стер понял что ".\." это то же самое что и ".", поэтому стер после пути "\." и получилось вот это:
Start "" "C:\Users\1234\AppData\Local\Programs\Microsoft VS Code\Code.exe" .
В общем это тот же самый "code ." но с прямым путем до файла.
Странно, как редактор кода понимает то, что ему передали через консоль? Это как-то предусмотрено в самой программе? У меня были мысли просто так-же запустить exe через старт и после пути к приложению добавить точку как аргумент который принимается за путь (точно так же как в команде "code .") но я посчитал это глупой идеей. Да и в любом случае я бы не догадался до "пустых" кавычек перед путем, фиг его знает что это означает, в комментарии кстати писали на stackoverflow что именно эта часть была упущением у кого-то.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.