添加“pre_value”来设置/ p userinp =

时间:2016-11-14 18:17:54

标签: windows batch-file cmd

我有以下代码,要求用户填写文件名:

echo Type in your filename (path + filename):
set userinp=
set /p userinp= ^> 

我想要什么: 已经'预填充'的完整路径+文件名,然后用户可以编辑。 在大多数情况下,这将是:%cd%+ filename(选择最常见的文件)

Type in your filename (path + filename):
> D:\Download\MyFile.txt

(字符串'D:\ Download \ MyFile.txt'应该是可编辑的)

注意:必须严格按照Windows批处理命令实现;不使用其他语言和/或程序。

2 个答案:

答案 0 :(得分:2)

此方法很简单,并且具有可以使用标准命令行导航键的优点,也就是说,除了版本之外,您可以输入文件夹/文件的第一个字母,并使用TAB浏览现有的文件夹/文件键。您甚至可以将"{TAB}"放入预填充值以自动预填充当前目录中的第一个文件,或者"Dat{TAB}"作为以" Dat"等开头的第一个文件。

@if (@CodeSection == @Batch) @then

@echo off
echo Type in your filename (path + filename):
cscript //nologo //E:JScript "%~F0" "%cd%\commonFile.ext"
set "userinp="
set /P "userinp=>"
echo Value read: "%userinp%"
goto :EOF

@end

WScript.CreateObject("WScript.Shell").SendKeys(WScript.Arguments(0));

请注意,此处用于执行一行JScr​​ipt代码的cscript命令是标准的" DOS"自XP以来所有Windows版本都提供的命令。

编辑包含第一个文件的路径

您可以将"%cd%\{TAB}"放入预填充值,以便获取当前文件夹中的第一个文件,包括路径;但是,如果路径包含任何空格,则此方法将失败。下面的新代码修复了这一点,尽管如果在路径中的任何一点存在两个具有相同名称的文件夹,直到第一个空格和所需文件夹不是第一个,它仍然可能会失败。

@if (@CodeSection == @Batch) @then

@echo off
setlocal EnableDelayedExpansion
set "curdir="
for %%a in ("%cd:\=" "%") do (
   for /F "tokens=1*" %%b in (%%a) do (
      set "curdir=!curdir!\%%b"
      if "%%c" neq "" set "curdir=!curdir!{TAB}"
   )
)
echo Type in your filename (path + filename):
cscript //nologo //E:JScript "%~F0" "%curdir:~1%\{TAB}"
set "userinp="
set /P "userinp=>"
echo Value read: "%userinp%"
goto :EOF

@end

WScript.CreateObject("WScript.Shell").SendKeys(WScript.Arguments(0));

答案 1 :(得分:0)

Code taken from aGerman on Dostips.com

@echo off &setlocal

call :PredefInput "Type in your filename (path + filename):>" "D:\Download\MyFile.txt" filename

echo Your filename is %filename%
pause

goto :eof
:::::::::: END ::::::::::


:PredefInput  ByVal_Message  ByVal_Predefined  ByRef_VarName
if "%__PRIN__%" neq "__PRIN__" (
  setlocal DisableDelayedExpansion
  if "%~3"=="" endlocal &exit /b 0
  set "M=%~1" &set "S=%~2" &set "N=0" &set "__PRIN__=__PRIN__"
  for /f %%i in ('"prompt;$h&for %%i in (1) do rem"') do set "BS=%%i"
  setlocal EnableDelayedExpansion
  <nul set /p "=.!BS! !BS!!M!!S!"
  set "S=A!S!"
  for /l %%i in (12,-1,0) do (
    set /a "N|=1<<%%i"
    for %%j in (!N!) do if "!S:~%%j,1!"=="" set /a "N&=~1<<%%i"
  )
  for %%i in (!N!) do endlocal &set "N=%%i"
)
set "C="
for /f "delims=" %%i in ('2^>nul xcopy /lw "%~f0" "%~f0"') do if not defined C set "C=%%i"
set "C=%C:~-1%"
setlocal EnableDelayedExpansion
if not defined C (
  echo(
  if defined S (
    for /f delims^=^ eol^= %%i in ("!S!") do endlocal &endlocal &set "%~3=%%i" &exit /b %N%
  ) else endlocal &endlocal &set "%~3=" &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 "=.%BS%!C!"
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 PredefInput