Batch file 为什么shift在具有%dp0的批处理文件中不能按预期工作?

Batch file 为什么shift在具有%dp0的批处理文件中不能按预期工作?,batch-file,Batch File,这是怎么回事?我完全搞不懂为什么batch没有“正确”地改变我的论点 下面是foo.bat: @echo off echo %~dp0 shift echo %~dp0 shift echo %~dp0 下面是我使用param运行它时发生的情况: C:\Users\Public>foo bar C:\Users\Public\ C:\Users\Public\ ECHO is off. 这些案例“更值得期待”: C:\Users\Public>foo c:/this/is/som

这是怎么回事?我完全搞不懂为什么batch没有“正确”地改变我的论点

下面是foo.bat:

@echo off
echo %~dp0
shift
echo %~dp0
shift
echo %~dp0
下面是我使用param运行它时发生的情况:

C:\Users\Public>foo bar
C:\Users\Public\
C:\Users\Public\
ECHO is off.
这些案例“更值得期待”:

C:\Users\Public>foo c:/this/is/some/other/path
C:\Users\Public\
c:\this\is\some\other\
ECHO is off.

但有人能澄清到底发生了什么吗?我想它会试图将“bar”解释为一个驱动器和路径,但在我的第一个例子中,它只是被解释为“bar”…

@ECHO OFF
SETLOCAL
回波参数=%*
回显文件“%~0”的驱动器名和路径为%dp0
转移
回显文件“%~0”的驱动器名和路径为%dp0
转移
回显文件“%~0”的驱动器名和路径为%dp0
后藤:EOF
也许这一更广泛的版本将有助于理解正在发生的事情


cmd
假设
在当前目录中
如果没有提供明确的目录…

它正在做它应该做的事情

这与轮班无关

你在呼应酒吧的驱动力和路径。由于bar不是一个文件,它会显示一个空白驱动器和路径

 "C:\Users\User\Desktop\b.bat" c:\windows\win.ini bar
在bat文件中

echo %~dp1
echo %~dp2
在依赖于
%~dp0
%0
或类似内容的脚本中应谨慎使用。考虑下面的例子:

@ECHO OFF
SETLOCAL
:start params review
echo.
echo starting ...
ECHO params=%*
echo param0=%0
echo full path is %~dp0
echo param1=%1
echo param2=%2
echo param3=%3
echo param4=%4
echo param5=%5
shift
if [%~1]==[] goto:EOF
goto :start

GOTO:EOF
C:\Program Files (x86)>test.bat a -b /c

starting ...
params=a -b /c
param0=test.bat
full path is C:\Program Files (x86)\
param1=a
param2=-b
param3=/c
param4=
param5=

starting ...
params=a -b /c
param0=a
full path is C:\Program Files (x86)\
param1=-b
param2=/c
param3=
param4=
param5=

starting ...
params=a -b /c
param0=-b
full path is C:\Program Files (x86)\
param1=/c
param2=
param3=
param4=
param5=
这很好,正如预期的那样,但是如果我们尝试使用一组不同的参数,一旦将“类似路径”的参数移到位置0,就会出现问题:

C:\Program Files (x86)>test.bat a /b -c

starting ...
params=a /b -c
param0=test.bat
full path is C:\Program Files (x86)\
param1=a
param2=/b
param3=-c
param4=
param5=

starting ...
params=a /b -c
param0=a
full path is C:\Program Files (x86)\
param1=/b
param2=-c
param3=
param4=
param5=

starting ...
params=a /b -c
param0=/b
full path is C:\
param1=-c
param2=
param3=
param4=
param5=
解决方案如SS64.com中所述,使用
SHIFT/1

@ECHO OFF
    SETLOCAL
    :start params review
    echo.
    echo starting ...
    ECHO params=%*
    echo param0=%0
    echo full path is %~dp0
    echo param1=%1
    echo param2=%2
    echo param3=%3
    echo param4=%4
    echo param5=%5
    shift
    if [%~1]==[] goto:EOF
    goto :start

    GOTO:EOF
C:\Program Files (x86)>test.bat a /b -c

starting ...
params=a /b -c
param0=test.bat
full path is C:\Program Files (x86)\
param1=a
param2=/b
param3=-c
param4=
param5=

starting ...
params=a /b -c
param0=test.bat
full path is C:\Program Files (x86)\
param1=/b
param2=-c
param3=
param4=
param5=

starting ...
params=a /b -c
param0=test.bat
full path is C:\Program Files (x86)\
param1=-c
param2=
param3=
param4=
param5=
@ECHO OFF
    SETLOCAL
    :start params review
    echo.
    echo starting ...
    ECHO params=%*
    echo param0=%0
    echo full path is %~dp0
    echo param1=%1
    echo param2=%2
    echo param3=%3
    echo param4=%4
    echo param5=%5
    shift
    if [%~1]==[] goto:EOF
    goto :start

    GOTO:EOF
C:\Program Files (x86)>test.bat a /b -c

starting ...
params=a /b -c
param0=test.bat
full path is C:\Program Files (x86)\
param1=a
param2=/b
param3=-c
param4=
param5=

starting ...
params=a /b -c
param0=test.bat
full path is C:\Program Files (x86)\
param1=/b
param2=-c
param3=
param4=
param5=

starting ...
params=a /b -c
param0=test.bat
full path is C:\Program Files (x86)\
param1=-c
param2=
param3=
param4=
param5=