CMD / Batch提示没有goto命令的输入循环

时间:2015-03-10 10:38:07

标签: windows loops batch-file cmd prompt

我有一个循环扫描文件夹的文件,我想询问每个文件是否应该移动。因为我已经在那个循环中,所以我不能使用goto命令。

如何在不使用goto命令的情况下提示输入循环(是/否)?

@echo off
setlocal enableDelayedExpansion

FOR %%a in (*.jpg) DO (

:: ask
set /p Input="Should !a! be moved? (yes/no)"

if %Input% == 'yes' (
MOVE !a! path/
)

if %Input% == 'no' (
:: just move on in loop
)

:: if not yes or no goback to ask

)

5 个答案:

答案 0 :(得分:2)

由于FOR循环的处理方式,您无法直接执行此操作。 你可以间接地做到这一点。查找call-command:

echo off
setlocal

for %%i in (*) do
    call :Bar %%i
goto :eof

:Bar  
@echo %1 
goto :eof 


:eof    
endlocal         

答案 1 :(得分:2)

@echo off
    setlocal enableextensions disabledelayedexpansion

    set "input="    
    for %%a in (*.jpg) do (
        cmd /v /e /q /c "for /l %%z in (0) do (set /p "input=Should %%a be moved (yes/no^)? " & if /i !input!==yes (exit 0) else if /i !input!==no (exit 1))"
        if not errorlevel 1 (
            echo move "%%a" "c:\somewhere"
        ) else (
            echo skipping %%a
        )
    )

为每个文件启动新的cmd实例以检索用户输入。验证此输入,并使用errolevel将用户选择返回到父代码。

虽然为循环的每次迭代启动一个新进程通常不是一个好主意,但在这种情况下,由于每个文件都需要用户交互,因此启动新cmd实例所需的时间可以被忽略,因为用户本身将需要更多的时间。

move命令仅回显给控制台。如果行为正确,请删除echo命令前缀的move

答案 2 :(得分:1)

@echo off
setlocal enableDelayedExpansion

FOR %%a in (*.jpg) DO (

   rem ask
   set /p Input="Should %%a be moved? (yes/no)"

   if "!Input!" == "yes" (
      MOVE %%a path/
   )

)

答案 3 :(得分:1)

PowerShell可以为您节省很多麻烦......

get-childitem "*.jpg" | foreach-object {
  move-item $_ "path/" -confirm
}

答案 4 :(得分:1)

另一种选择是choice命令,它只接受预定义的击键,因此不需要检查有效选项:

@echo off
setlocal enableDelayedExpansion
FOR %%a in (*.jpg) DO (
  choice /C YN /M "Should %%a be moved? "
  if %errorlevel% == 2 echo not moving
  if %errorlevel% == 1 move "%%a" path\
)

有关详细信息,请使用choice /?

(注意:choice在某些Windows版本中不可用)