Войти

Показать полную графическую версию : [решено] Вставка текста из буфера обмена


Страниц : [1] 2

idlazarev_alex@vk
05-06-2014, 23:06
Всем салют! нужно вставить текст из буфера обмена в bat, ну т.е присвоить переменную %share%, и при вызывании %share% показывался текст из буфера обмена.
Пример:

echo Ваш текст: %share%


для показа текста из буфера можно использовать:

@ECHO OFF & MSHTA.EXE "javascript:var s=clipboardData.getData('text');if(s)new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1).Write(s);close();" 1 | MORE
Pause

только как присвоить переменную я не пойму...
Заранее спасибо!

Iska
06-06-2014, 04:48
присвоить переменную »
Может быть — «присвоить переменной»?

@echo off
setlocal

for /f "tokens=2 delims=:" %%i in ('chcp') do (
set sPrevCP=%%i
chcp 1251 >nul
)

for /f "usebackq delims=" %%i in (
`@"%systemroot%\system32\mshta.exe" "javascript:var s=clipboardData.getData('text'); {try {new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1).WriteLine(s)} catch (e){}} close();" ^
1^|more`
) do set share=%%i

chcp %sPrevCP% >nul

if defined share echo [%share%]

endlocal
exit /b 0

idlazarev_alex@vk
06-06-2014, 10:30
Iska, спасибо, что поправили, ну и за скрипт тоже.

gora
06-06-2014, 12:46
нужно вставить текст из буфера обмена »
Строго говоря вариант от коллеги Iska вставит в переменную только последнюю строку текста, ибо много строковых переменных в бат не бывает.

Iska
06-06-2014, 13:36
gora, угу.

В принципе сами переменные окружения относятся к этому индифферентно:
With WScript.CreateObject("WScript.Shell")
.Environment("Process").Item("Sample") = "1 строка" & vbCrLf & "2 строка" & vbCrLf & "3 строка"
.Run "cmd.exe /k set Sample"
End With

А вот с пакетными файлами — увы, не попадалось. Есть «финт ушами», создающий многострочную переменную окружения, но и там не всё гладко — вместо CrLf будет только Lf. Ещё неизвестно, что хуже выйдет.

Sisin
04-10-2019, 22:12
Iska, а как сделать, чтобы в переменной share проверялось наличие ":" и тогда заменялось бы на "."???

Пример: В буфере "1111:1111", а надо, чтобы в таком случае стало бы "1111.1111".

Iska
05-10-2019, 00:27
Sisin, опишите Вашу задачу полностью.

Sisin
05-10-2019, 00:54
Sisin, опишите Вашу задачу полностью. »

@echo off
setlocal

for /f "tokens=2 delims=:" %%i in ('chcp') do (
set sPrevCP=%%i
chcp 1251 >nul
)

for /f "usebackq delims=" %%i in (
`@"%systemroot%\system32\mshta.exe" "javascript:var s=clipboardData.getData('text'); {try {new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1).WriteLine(s)} catch (e){}} close();" ^
1^|more`
) do set share=%%i

chcp %sPrevCP% >nul

if defined share echo [%share%]

endlocal
exit /b 0

Так это она и есть. Только перед if defined share echo [%share%] проверить наличие ":" и заменить на ".". И проверить соответствует ли содержание буфера маске 0000:00:00. Если нет, то выйти.

Или сначала проверить соответствует ли содержание буфера маске 0000:00:00. Если нет, то выйти. Если да, то проверить наличие ":" и заменить на ".".

Iska
05-10-2019, 01:32
Sisin, это не задача. Это уже выбранное решение. Я же хочу услышать саму изначальную задачу.

проверить соответствует ли содержание буфера маске 0000:00:00. Если нет, то выйти. Если да, то проверить наличие ":" и заменить на ".". »
Где заменить — в буфере обмена? Что есть «маска 0000:00:00» — цифры?

Sisin
05-10-2019, 01:42
Где заменить — в буфере обмена? Что есть «маска 0000:00:00» — цифры? »

Чтобы в этот момент if defined share echo [%share%] выводилось бы уже с заменой.
0000:00:00 - только цифры.

Iska
05-10-2019, 02:10
Опять Вы не о том, что я хотел бы услышать.

Ну, пробуйте:
@echo off
setlocal enableextensions enabledelayedexpansion

for /f "tokens=2 delims=:" %%i in ('chcp') do (
set sPrevCP=%%i
>nul chcp 1251
)

for /f "usebackq delims=" %%i in (
`@"%systemroot%\system32\mshta.exe" "javascript:var s=clipboardData.getData('text'); {try {new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1).WriteLine(s)} catch (e){}} close();" ^
1^|more`
) do set sShare=%%i

>nul chcp %sPrevCP%

if defined sShare (
echo %sShare%| >nul 2>&1 findstr.exe /i /r /c:"[0-9][0-9][0-9][0-9]:[0-9][0-9]:[0-9][0-9]" && (
set sShare=%sShare::=.%
echo [!sShare!]
)
)

endlocal
exit /b 0

DJ Mogarych
05-10-2019, 10:16
Powershell:
$var = Get-Clipboard
if ($var -match ':') {
$var = $var -replace ':','.'
}

Sisin
05-10-2019, 11:21
Ну, пробуйте: »

Если в буфере 0000:00:00, то работает,
если 000000:00:00 - тоже работает, а не должно.

Проверка по маске нужна, чтобы в буфере не было комбинации отличной от маски. И чтобы выводилось echo "ERROR" в случае несоответствия, а затем exit /b 0.

т.е.
Если буфер соответствует маске 0000:00:00, то заменить ":" на "." и вывести echo [!sShare!] и exit /b 0,
а если нет, то echo "ERROR" и exit /b 0.

DJ Mogarych
05-10-2019, 11:58
Если в буфере 0000:00:00, то работает,
если 000000:00:00 - тоже работает, а не должно. »

$var = Get-Clipboard
if ($var -match "^\d{4}:") {
$var = $var -replace ':','.'
}
else {
write-host -fore red "ERROR!!!1"
}

Sisin
05-10-2019, 12:19
DJ Mogarych, спасибо, но мне надо исключительно в bat.

Iska
05-10-2019, 14:15
Sisin, моя недоработка, приношу Вам свои извинения.

Добавьте в единственной строке то, что помечено выделенным:
echo %sShare%| >nul 2>&1 findstr.exe /i /r /c:"^[0-9][0-9][0-9][0-9]:[0-9][0-9]:[0-9][0-9]$" && (
или:
echo %sShare%| >nul 2>&1 findstr.exe /i /r /b /e /c:"[0-9][0-9][0-9][0-9]:[0-9][0-9]:[0-9][0-9]" && (

Sisin
05-10-2019, 14:23
Добавьте в единственной строке то, что помечено выделенным: »

а echo "ERROR" и exit /b 0?

Iska
05-10-2019, 14:31
Sisin, если error — тогда не 0.

Попробуйте так:
@echo off
setlocal enableextensions enabledelayedexpansion

for /f "tokens=2 delims=:" %%i in ('chcp') do (
set sPrevCP=%%i
>nul chcp 1251
)

for /f "usebackq delims=" %%i in (
`@"%systemroot%\system32\mshta.exe" "javascript:var s=clipboardData.getData('text'); {try {new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1).WriteLine(s)} catch (e){}} close();" ^
1^|more`
) do set sShare=%%i

>nul chcp %sPrevCP%

if defined sShare (
echo %sShare%| >nul 2>&1 findstr.exe /i /r /c:"^[0-9][0-9][0-9][0-9]:[0-9][0-9]:[0-9][0-9]$" && (
set sShare=%sShare::=.%
echo [!sShare!]
) || (
echo Error
exit /b 2
)
) else (
echo Error
exit /b 1
)

endlocal
exit /b 0

Sisin
05-10-2019, 14:44
Попробуйте так: »

Огромное спасибо. Все как надо! :clapping:

Sisin
05-10-2019, 16:40
Iska, подскажите, пожалуйста, почему эта строка:

echo %sShare%| >nul 2>&1 findstr.exe /i /r /c:"^[0-9][0-9][0-9][0-9]:[0-9][0-9]:[0-9][0-9]$" && (

имеет ограничение на количество цифр??
например, я хочу увеличить маску до 12345678:12345678:12345678, изменил на:
"^[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]:[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]:[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]$"

а строка не срабатывает. Вроде ограничений быть не должно.

Если попробовать добавить цифры в маску здесь: http://forum.oszone.net/post-2890775.html#post2890775

то findstr.exe выдает ошибку.




© OSzone.net 2001-2012