Page 1 of 1
short way to input with xcopy
Posted: 14 Apr 2014 13:26
by pieh-ejdsch
Hallo,
I've seen this in most batches:
Code: Select all
for /f "delims=" %%A in ('xcopy /w "%~f0" "%~f0" 2^>nul') do (
if not defined key set "key=%%A"
)
set "key=!key:~-1!"
There is a simpe way to read the first line:
The output with file is not promt when use /Q
In destination I use "NUL:\*" - this isn't a Drive or a Location but no output for error. And the message with /L Option is anyone OK.
Code: Select all
for /F "eol=1delims=" %%x in ('xcopy /WQL "%~f0" NUL:\*') do (set "key=%%x"
set "key=!key:~-1!"
)
To read as any more input as once use an Intitialize-Token from xcopy output like this
Code: Select all
@echo off
setlocal disabledelayedexpansion
:init_token_Keypress
for /f %%n in ('echo( ^|cmd /q /u /c "for /f "eol^=1delims^=" %%E in ('xcopy /WQL "%comspec%" nul:\*') do echo(%%E"^|find /c " "') do set /a Keytoken= %%n
:Input
(
for /F "eol=1tokens=%keytoken%delims= " %%x in ('xcopy /WQL "%~f0" NUL:\*') do set "key=%%x"
)|| set "key= "
goto :Input
Phil
Re: short way to input with xcopy
Posted: 14 Apr 2014 17:00
by aGerman
Good idea. It's more consistent to avoid errors instead of ignoring them. Also the EOL=1 is a nice workaround to process only the first line. I hope it's language independent (means that the number of copied files must be the biginning of the line).
Regards
aGerman
Re: short way to input with xcopy
Posted: 15 Apr 2014 03:35
by einstein1969
I agree. It's a good idea. I have tested on my win 7 32 italian and the only problem is for the second trick.
My xcopy don't put a space after the prompt for keypress.
Code: Select all
>xcopy /WQL $$$$ NUL:\*
Premere un tasto per cominciare a copiare dei file
after press A:
Code: Select all
>xcopy /WQL $$$$ NUL:\*
Premere un tasto per cominciare a copiare dei fileA
1 File
then need the set "key=!key:~-1!"
The first trick work well. Thanks Phil.
einstein1969
Re: short way to input with xcopy
Posted: 15 Apr 2014 03:59
by foxidrive
There is a simpe way to read the first line:
The output with file is not promt when use /Q
In destination I use "NUL:\*" - this isn't a Drive or a Location but no output for error. And the message with /L Option is anyone OK.
Code: Select all
for /F "eol=1delims=" %%x in ('xcopy /WQL "%~f0" NUL:\*') do (set "key=%%x"
set "key=!key:~-1!"
)
It does seem useful.
To read as any more input as once use an Intitialize-Token from xcopy output like this
Code: Select all
@echo off
setlocal disabledelayedexpansion
:init_token_Keypress
for /f %%n in ('echo( ^|cmd /q /u /c "for /f "eol^=1delims^=" %%E in ('xcopy /WQL "%comspec%" nul:\*') do echo(%%E"^|find /c " "') do set /a Keytoken= %%n
:Input
(
for /F "eol=1tokens=%keytoken%delims= " %%x in ('xcopy /WQL "%~f0" NUL:\*') do set "key=%%x"
)|| set "key= "
goto :Input
How is this meant to work, Phil?
Re: short way to input with xcopy
Posted: 15 Apr 2014 13:16
by aGerman
foxidrive wrote:How is this meant to work, Phil?
:init_token_Keypress counts the tokens in the first line. As einstein1969 already mentioned it only works if the pressed key is separated with a space like in my output (the space next to "starten" is already part of the XCOPY output).
Eine beliebige Taste drücken, um das Kopieren der Datei(en) zu starten x
1 Datei(en) kopiert
Of course you have to include some meaningful code into the :Input loop
Some changed examples:
Hidden_Input.bat
Code: Select all
@echo off &setlocal
<nul set /p "=Enter your password: "
call :HInput pw
echo Input length is %errorlevel%
setlocal EnableDelayedExpansion
echo Your password is !pw!
pause
goto :eof
:HInput [ByRef_VarName]
:: inspired by Carlos
:: improved by pieh-ejdsch
if "%__HI__%" neq "__HI__" (
setlocal DisableDelayedExpansion
set "S=" &set "N=0" &set "__HI__=__HI__"
for /f %%i in ('"prompt;$h&for %%i in (1) do rem"') do set "BS=%%i"
)
set "C="
for /f "eol=1 delims=" %%i in ('xcopy /lwq "%~f0" :\') do set "C=%%i"
set "C=%C:~-1%"
setlocal EnableDelayedExpansion
if not defined C (
echo(
if "%~1"=="" (
echo(!S!
endlocal &endlocal &exit /b %N%
) else (
if defined S (
for /f delims^=^ eol^= %%i in ("!S!") do endlocal &endlocal &set "%~1=%%i" &exit /b %N%
) else endlocal &endlocal &set "%~1=" &exit /b 0
)
)
if "!BS!"=="!C!" (
set "C="
if defined S set /a "N -= 1" &set "S=!S:~,-1!" &<nul set /p "=%BS% %BS%"
) else set /a "N += 1" &<nul set /p "=*"
if not defined S (
endlocal &set "N=%N%" &set "S=%C%"
) else for /f delims^=^ eol^= %%i in ("!S!") do endlocal &set "N=%N%" &set "S=%%i%C%"
goto HInput
Choice_Imitation.bat
Code: Select all
@echo off &setlocal
<nul set /p "=Yes or No [yn]: "
call :choice yn
echo Option #%errorlevel% was chosen.
pause
goto :eof
:choice ByVal_Choices
setlocal DisableDelayedExpansion
set "n=0" &set "c=" &set "e=" &set "map=%~1"
if not defined map endlocal &exit /b 0
for /f "eol=1 delims=" %%i in ('xcopy /lwq "%~f0" :\') do set "c=%%i"
set "c=%c:~-1%"
if defined c (
for /f delims^=^ eol^= %%i in ('cmd /von /u /c "echo(!map!"^|find /v ""^|findstr .') do (
set /a "n += 1" &set "e=%%i"
setlocal EnableDelayedExpansion
if /i "!e!"=="!c!" (
echo(!c!
for /f %%j in ("!n!") do endlocal &endlocal &exit /b %%j
)
endlocal
)
)
endlocal &<nul set /p "=" &goto choice
I left the %var:~-1% technique since we know counting the tokens could fail.
Regards
aGerman
Re: short way to input with xcopy
Posted: 15 Apr 2014 15:10
by pieh-ejdsch
@aGerman thank you for that explanation.
I can't do that - my bad english So I have competed the code, that the last Token before Input is Autoset.
At other language settings for example.
Code: Select all
@echo off
setlocal disabledelayedexpansion
:init_token_Keypress
for /f "eol=1delims=#" %%d in ('"echo(#|xcopy /WQL %comspec% nul:\*"') do set "Line=%%d"
set "delim=%line:~-1%"
for /f %%n in ('^(echo^(^&echo^("%%Line:%delim%="^&echo^("%%"^)^|find /c /v """"""') do set /a token= %%n
:init_Vars
set Enter=3
for /f %%+ in ('copy /Z "%~dpf0" nul') do (rem CR
for /f %%- in ('"prompt;$h&for %%i in (1) do rem"') do (set "bs=%%-" &rem BackSpace
echo Input ....
call :Input %enter%
))
exit /b
:Input
for %%. in (.) do (
for /F eol^=1tokens^=%token%delims^=^%delim% %%x in ('xcopy /WQL "%~f0" NUL:\*') do (
if %%x equ %%+ if ^%enter% equ 1 exit /b
if %%x equ %%- (
set key=%%x %%x%%x %%x%%x %%x
) else set "key=%%x"
)
) || set "key=%delim%"
<nul set/p=*^%key%
:>nul&set /a enter-=1 &echo(&goto :Input
set /a enter=%1
goto :Input
And a bug with <CR> I found. argh not. It means the CR is not Present at %var% expansion.
Behind Output is a command beginning with :
When Variable Key is <CR> btw empty - the line will end in Next and proceed this.
Phil
Re: short way to input with xcopy
Posted: 15 Apr 2014 16:54
by foxidrive
aGerman wrote:foxidrive wrote:How is this meant to work, Phil?
:init_token_Keypress counts the tokens in the first line. As einstein1969 already mentioned it only works if the pressed key is separated with a space like in my output (the space next to "starten" is already part of the XCOPY output).
Eine beliebige Taste drücken, um das Kopieren der Datei(en) zu starten x
1 Datei(en) kopiert
Of course you have to include some meaningful code into the :Input loop
Thanks aGerman.
Re: short way to input with xcopy
Posted: 16 Apr 2014 19:14
by einstein1969
Hi,
This approch use few cpu on multicore but on my monocore is high!!
Can I reduce the cpu usage using:
but why not use this with multithreading batch (START /B) or pipe?
einstein1969
Re: short way to input with xcopy
Posted: 17 Apr 2014 11:42
by pieh-ejdsch
In your code, for execution is not terminated if not j; n or y n, etc. depending on the language setting is pressed. At a keystroke, the researchers bight could be completed in a subroutine through an exit / b. However, if the option is only an indefinite keystroke to read something, then I use this variant. How have you implemented this in your code?
In the output of the second line is on success (enter yes ) a 1 at the beginning, made with nothing ( no input ) a 0 at the beginning. This would be reissued with FIND "/" only the first line. My goal was to limit the output of the researchers bight without a second command to an output.
Phil
EDIT by aGerman: translated the German text that Phil gave me via PM
In your code the FOR loop will not be terminated until you pressed j,n or y,n (depending on your local settings). You could terminate a subroutine with EXIT /B by pressing a key though. However, if the goal is to read any keystroke I use the technique I posted above. How did you implement it?
The second line of the output shows a 1 at the beginning of the line if you confirmed or a 0 if you denied the request for copying. You would have to use FIND "/" to get only the first line. My goal was to get the result directly out of the FOR loop without using an additional command.
Re: short way to input with xcopy
Posted: 17 Apr 2014 22:15
by Ed Dyreen
pieh-ejdsch wrote:In destination I use "NUL:\*" - this isn't a Drive or a Location but no output for error. And the message with /L Option is anyone OK.
And since relative paths are supported "NUL:\*" <==> "\"
Code: Select all
@echo off &prompt $g &setlocal enableDelayedExpansion
set "$=" &for /f "eol=1 delims=" %%? in ( 'xcopy.EXE /WQL "%comspec%" \' ) do set "$=%%?" &set "$=!$:~-1!"
echo.$=!$!_
pause
exit
I also found ":\" to be accepted, the "it's a valid path check" shows to be minimalistic and buggy.
Re: short way to input with xcopy
Posted: 20 Apr 2014 15:54
by einstein1969
pieh-ejdsch wrote:In your code, for execution is not terminated if not j; n or y n, etc. depending on the language setting is pressed. At a keystroke, the researchers bight could be completed in a subroutine through an exit / b. However, if the option is only an indefinite keystroke to read something, then I use this variant. How have you implemented this in your code?
In the output of the second line is on success (enter yes ) a 1 at the beginning, made with nothing ( no input ) a 0 at the beginning. This would be reissued with FIND "/" only the first line. My goal was to limit the output of the researchers bight without a second command to an output.
Phil
Hi Phil,
I have not complete understaind what you write in your post . My goal seem different.
I need to manage multiple input at high rate. I don't care if xcopy finish with "s" or "j". I reRun for continuos input.
I have probed this but i have difficult to stabilize. This can manage 10 keystroke at time. I have reRun the xcopy for 3 time because i have not implemented a method for exit.
this is a test at command prompt
Code: Select all
for /l %n in (1,1,3) do @xcopy /pl $$$$ $$$$ 2>nul | cmd /q /v:o
n /c"echo Start & For /L %# in (1,1,10) do @(echo %#&set L=&set /p L=&if defined
L (echo(%#:'!L!'|find /V "$$$$") else (echo %#:!L! exit ) ) "
EDIT: $$$$ is a temporary file that must exist
einstein1969
Re: short way to input with xcopy
Posted: 20 Apr 2014 16:36
by aGerman
[OT]
I have not complete understaind what you write in your post .
Phil was so kind and wrote a PM with the origin German text. I appended my translation to his post above (even if my English is anything but perfect).
@Phil I hope you agree with my translation. Please complain otherwise.
Regards
aGerman[/OT]
Re: short way to input with xcopy
Posted: 18 Aug 2014 12:33
by pieh-ejdsch
einstein1969 wrote:Hi Phil,
I have not complete understaind what you write in your post . My goal seem different.
I need to manage multiple input at high rate. I don't care if xcopy finish with "s" or "j". I reRun for continuos input.
I have probed this but i have difficult to stabilize. This can manage 10 keystroke at time. I have reRun the xcopy for 3 time because i have not implemented a method for exit.
this is a test at command prompt
Code: Select all
for /l %n in (1,1,3) do @xcopy /pl $$$$ $$$$ 2>nul | cmd /q /v:on /c"echo Start & For /L %# in (1,1,10) do @(echo %#&set L=&set /p L=&if defined L (echo(%#:'!L!'|find /V "$$$$") else (echo %#:!L! exit ) ) "
EDIT: $$$$ is a temporary file that must exist
einstein1969
Your code for cmd prompt ends:
temporary files not needed,
supports strg+C
Code: Select all
for /f "tokens=1-7delims=-" %O in ("xcopy/lp %comspec% nul:\*-Abort-exit /b-set x=-set/p-defined-echo(") do @for /f "tokens=2,3delims=(/)" %M in ('"%O<nul|(%S:=&set:)"') do @(%O||<nul %S"=%P")|(cls&%Uinput Ends with [STRG]+[C] or [%M] or [%N]&cmd/v/k"%R1&for /L %L in (.) do @set .=&%S.=&(if !.! equ %P %U%P!&%Q)&if not %T . (if %T x (%U- your key is DEL, TAB or Enter&%R) else %R1) else if !.:~1^,1!. equ . %U!.!&%R& if /i !.! equ %M (%Q) else if /i !.! equ %N %Q")
How/where did you implement this code into Batch?
Phil