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