Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Вставка текста из буфера обмена (http://forum.oszone.net/showthread.php?t=283213)

idlazarev_alex@vk 05-06-2014 23:06 2360518

Вставка текста из буфера обмена
 
Всем салют! нужно вставить текст из буфера обмена в 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 2360583

Цитата:

Цитата idlazarev_alex@vk
присвоить переменную »

Может быть — «присвоить переменной»?

Код:

@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 2360640

Iska, спасибо, что поправили, ну и за скрипт тоже.

gora 06-06-2014 12:46 2360709

Цитата:

Цитата idlazarev_alex@vk
нужно вставить текст из буфера обмена »

Строго говоря вариант от коллеги Iska вставит в переменную только последнюю строку текста, ибо много строковых переменных в бат не бывает.

Iska 06-06-2014 13:36 2360736

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 2890752

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

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

Iska 05-10-2019 00:27 2890762

Sisin, опишите Вашу задачу полностью.

Sisin 05-10-2019 00:54 2890765

Цитата:

Цитата Iska
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 2890770

Sisin, это не задача. Это уже выбранное решение. Я же хочу услышать саму изначальную задачу.

Цитата:

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

Где заменить — в буфере обмена? Что есть «маска 0000:00:00» — цифры?

Sisin 05-10-2019 01:42 2890772

Цитата:

Цитата Iska
Где заменить — в буфере обмена? Что есть «маска 0000:00:00» — цифры? »

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

Iska 05-10-2019 02:10 2890775

Опять Вы не о том, что я хотел бы услышать.

Ну, пробуйте:
Скрытый текст
Код:

@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 2890797

Powershell:
Код:

$var = Get-Clipboard
if ($var -match ':') {
$var = $var -replace ':','.'
}


Sisin 05-10-2019 11:21 2890809

Цитата:

Цитата Iska
Ну, пробуйте: »

Если в буфере 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 2890815

Цитата:

Цитата Sisin
Если в буфере 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 2890819

DJ Mogarych, спасибо, но мне надо исключительно в bat.

Iska 05-10-2019 14:15 2890828

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 2890830

Цитата:

Цитата Iska
Добавьте в единственной строке то, что помечено выделенным: »

а echo "ERROR" и exit /b 0?

Iska 05-10-2019 14:31 2890831

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 2890833

Цитата:

Цитата Iska
Попробуйте так: »

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

Sisin 05-10-2019 16:40 2890835

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 выдает ошибку.

Iska 05-10-2019 18:17 2890848

Цитата:

Цитата 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]$" && (
имеет ограничение на количество цифр?? »

Потому что таковы ограничения findstr.exe.

Вновь повторю изначальный вопрос: какова сама задача?

Sisin 05-10-2019 18:45 2890852

Цитата:

Цитата Iska
Вновь повторю изначальный вопрос: какова сама задача? »

Есть батник, который создает папки, файлы, конвертирует, печатает и раскидывает их по нужным местам. В нем есть переменная вроде sShare, которая задается вручную. Вчера случайно нашел Ваш батник с первой страницы и подумал, что хорошая идея и надо ее взять на вооружение))) Но вот незадача, некоторые комбинации цифр оказываются длиннее. 12345678:12345678:12345678 - это номера папок в названии папки. Я просмотрел все варианты и самый большой в трех случаях 8 цифр. Как-то так.

т.е. переменной sShare надо передать значение до 12345678.12345678.12345678, а в буфер оно скидывается как 12345678:12345678:12345678.

я могу настроить, чтобы в буфер скидывались значения с добавленными впереди нулями и тогда маска будет одна - 12345678.12345678.12345678, ну или в случае оптимизации я уберу по 1 или 2 числам из каждой комбинации.

Iska 05-10-2019 19:27 2890857

Sisin, есть смысл рассмотреть переход на WSH или сразу на PowerShell.

Или попросить кого-нибудь, кто хорошо владеет JScript, вставить проверку сразу сюда:
Код:

"%systemroot%\system32\mshta.exe" "javascript:var s=clipboardData.getData('text'); {try {new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1).WriteLine(s)} catch (e){}} close();

Sisin 05-10-2019 20:10 2890865

Цитата:

Цитата Iska
Sisin, есть смысл рассмотреть переход на WSH или сразу на PowerShell. »

А нельзя сделать так:
переменная a
переменная b
переменная c
переменная sShare

sShare = 56787655:78941564:98754567
найти первые цифры в sShare до ":"
a = 56787655
c = 78941564:98754567
sShare = c
найти первые цифры в sShare до ":"
b = 78941564
c = 98754567
проверить по маске 12345678 переменные a,b,c, если все ок, то
sShare = a&"."&b&"."&c = 56787655.78941564.98754567, если нет, то echo error.

alpap 05-10-2019 21:22 2890869

Цитата:

Цитата Sisin
А нельзя сделать так: »

можно
(именно под маску: 12345678:12345678:12345678)
Код:

@echo off
set m=[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]

for /f "delims=" %%a in (
 'mshta "javascript:var x=clipboardData.getData('text');if(x)new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1).Write(x);close();"'
) do set "z=%%a"& call :#
pause& exit

:#
 for /f "tokens=1-3 delims=:" %%a in ("%z%") do (
  echo %%a|>nul findstr /rc:"^%m%$"&& (set a1=%%a)|| (goto err)
  echo %%b|>nul findstr /rc:"^%m%$"&& (set a2=%%b)|| (goto err)
  echo %%c|>nul findstr /rc:"^%m%$"&& (set a3=%%c)|| (goto err)
 )
 echo %a1%.%a2%.%a3%
exit /b

:err
 echo ERROR& pause
exit /b


Sisin 05-10-2019 21:30 2890870

Цитата:

Цитата alpap
можно
(именно под маску: 12345678:12345678:12345678) »

Я же правильно понимаю, что могу внести несколько масок
set m1=[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]
set m2=[0-9][0-9][0-9][0-9][0-9][0-9][0-9]
set m3=[0-9][0-9][0-9][0-9][0-9][0-9]

и для каждой a1,a2,a3 использовать свою?

Iska 05-10-2019 21:30 2890871

Цитата:

Цитата Sisin
sShare = 56787655:78941564:98754567
найти первые цифры в sShare до ":" »

Sisin, а когда там нет ни цифр, ни «:» — что прикажете делать?

Sisin 05-10-2019 21:33 2890872

Цитата:

Цитата Iska
Sisin, а когда там нет ни цифр, ни «:» — что прикажете делать? »

Вывести ошибку.

Iska 05-10-2019 22:50 2890879

Sisin, Вы не поймёте. У нас есть ограничение по длине маски. И всякие обходные пути — не всегда работают. Проверьте, например:
Код:

12345678:12345678:12345678:Жил:был:пёс
на коде коллеги alpap:

Данный вариант успешно проходит проверку, хотя и не должен.

Sisin 05-10-2019 23:01 2890884

Цитата:

Цитата Iska
на коде коллеги alpap: »

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

Наверное, можно добавить после echo %%c|>nul findstr /rc:"^%m%$"&& (set a3=%%c)|| (goto err) строку, что если дальше идет еще что-то, то goto err.
Это выход??

Iska 06-10-2019 01:33 2890896

Цитата:

Цитата Sisin
Наверное, можно добавить после echo %%c|>nul findstr /rc:"^%m%$"&& (set a3=%%c)|| (goto err) строку, что если дальше идет еще что-то, то goto err.
Это выход?? »

Нет. В этом месте строка уже нарезана на части (из которых берётся ровно три первых).

Вы зря не хотите попробовать WSH/PoSH. Рано или поздно, но всё одно придётся переползать с пакетных файлов.


Время: 07:50.

Время: 07:50.
© OSzone.net 2001-