CMD/Batch 在没有 goto 命令的情况下提示输入循环

CMD/Batch Prompting for Input loop without goto command

我循环扫描一个文件夹的文件,我想询问每个文件是否应该移动。因为我已经在那个循环中,所以我不能使用 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

)

由于 FOR 循环的处理方式,您不能直接这样做。 你可以间接地做到这一点。查找调用命令:

echo off
setlocal

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

:Bar  
@echo %1 
goto :eof 


:eof    
endlocal         
@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 实例以检索用户输入。此输入已验证,错误级别用于 return 用户选择父代码。

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

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

@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/
   )

)

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

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

另一种选择是 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 版本中不可用)