Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 如何为命令行参数创建变量?_Windows_Batch File - Fatal编程技术网

Windows 如何为命令行参数创建变量?

Windows 如何为命令行参数创建变量?,windows,batch-file,Windows,Batch File,我有一个.bat文件,它对文件夹中的文件执行一些操作。但在此之前,它会询问用户是否也在子文件夹中执行这些操作。之后,脚本将变量%recursive%的值设为/r或空,具体取决于用户键入的内容,并按如下方式运行命令: for %recursive% %folder% ... 当然,它不起作用。我不能为命令创建两个FOR(带递归参数和不带递归参数),因为它们内部都有相同的代码。 你建议我做什么? 提前谢谢 代码是: :LoopStart set /p recursive="Including su

我有一个.bat文件,它对文件夹中的文件执行一些操作。但在此之前,它会询问用户是否也在子文件夹中执行这些操作。之后,脚本将变量%recursive%的值设为/r或空,具体取决于用户键入的内容,并按如下方式运行命令:

for %recursive% %folder% ...
当然,它不起作用。我不能为命令创建两个FOR(带递归参数和不带递归参数),因为它们内部都有相同的代码。 你建议我做什么? 提前谢谢

代码是:

:LoopStart
set /p recursive="Including sub-folders? [y] or [n]: "
IF /I "%recursive%"=="y" (
    set "myFOR=for /r"
    GOTO :LoopEnd
) ELSE (
    IF /I "%recursive%"=="n" (
        set "myFOR=for"
        GOTO :LoopEnd
    ) ELSE (
        GOTO LoopStart
        )
    ) 
:LoopEnd
%myFOR% %img_dir% %%i in (*.jpg,*.emf,*.png,*.jpeg,*.gif) do (
    echo This is file %%~nxi
)
编辑-适用于建议答案的操作代码

@echo off
    setlocal

    set "img_dir=d:\temp"

:LoopStart
    set /p "recursive=Including sub-folders? [y] or [n]: "

    IF /I "%recursive%"=="y" (
        set "recursive=/r"
    ) ELSE IF /I "%recursive%"=="n" (
        set "recursive="
    ) ELSE (
        GOTO LoopStart
    ) 

    pushd "%img_dir%"
    for %recursive% %%i in (*.jpg,*.emf,*.png,*.jpeg,*.gif) do (
        echo This is file %%~fi
    )
    popd

endlocal

添加了pushd和popd命令,不是为了处理递归情况下的问题(可以包含路径),而是为了处理没有递归的情况,因为路径未包含在使用for命令处理的文件集中。

这是有效的。如果变量为空,则将忽略它

@echo off
set "recursive="
call :code
set recursive=/r
call :code
goto :eof

:code
for %recursive% %%a in (*) do echo %%a
pause

它在其他地方不起作用。我不知道为什么,它会关闭窗口,即使在插入“暂停”时也是如此。@Cuder:您将目录保留在“for”行中的“for non recursive”选项中,这是不允许的。请参阅更新的答案。这在递归或非递归情况下处理问题。如果您决定不更改目录,那么对于非递归的情况,文件的路径应该包含在for文件集中,类似于
for%%f in(“c:\*.*”d:\where\*.txt”)
是的。测试上述脚本。
@echo off
set "recursive="
call :code
set recursive=/r
call :code
goto :eof

:code
for %recursive% %%a in (*) do echo %%a
pause