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