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
Batch file 在批处理文件的集合变量中“:2”是什么意思_Batch File - Fatal编程技术网

Batch file 在批处理文件的集合变量中“:2”是什么意思

Batch file 在批处理文件的集合变量中“:2”是什么意思,batch-file,Batch File,我的批处理文件@SET%~1=%~$PATH\u VARNAME:2中有这一行。我不明白:2代表什么 更多详情: @SET PATH_VARNAME=!%~3! @IF NOT DEFINED PATH_VARNAME SET PATH_VARNAME=%PATH% @SET %~1=%~$PATH_VARNAME:2 %~1和%~3是ARGV参数。 当我在最后一个设置后回显%1时,它显示C:\Mycomuter\currentdir\example\interface\set\u LIB

我的批处理文件@SET%~1=%~$PATH\u VARNAME:2中有这一行。我不明白:2代表什么

更多详情:

@SET PATH_VARNAME=!%~3! 
@IF NOT DEFINED PATH_VARNAME SET PATH_VARNAME=%PATH%

@SET %~1=%~$PATH_VARNAME:2
%~1和%~3是ARGV参数。 当我在最后一个设置后回显%1时,它显示C:\Mycomuter\currentdir\example\interface\set\u LIB\u PERL\u GENE\u CSV.bat

C:\Mycomuter\currentdir\example\interface\是%path%环境变量中的第一个路径,SET_LIB_PERL_GENE_CSV.bat是第二个ARGV参数

这行%~$PATH\u VARNAME:2的意思是什么,它采用PATH\u VARNAME的第一个路径并将其与.bat文件集\u LIB\u PERL\u GENE\u CSV.bat的第二个参数连接起来

致意

set "path_varname=%~dp0"
call :test myvar "%~nx0"
echo(%myvar%
exit /b

:test
set "%~1=%~$PATH_VARNAME:2"
在%PATH\u VARNAME%中搜索%2,并将值设置为%1

该示例将在%path\u name%脚本目录中搜索传递给%nx0脚本名的%2,并将该值分配给%1 myvar

结果显示为echo%myvar%,这将是脚本的完整路径

见/?在底部提到:

PATH可以是带有PATH的任何有效变量。

一些更深入的信息: 语法%~$PATH:I很少使用,但它有一些意想不到的行为

批处理文件中的行为 简单百分比版本%~$PATHVARIABLE: 只允许数字0-9,否则将引发语法错误 如果在PATHVARIABLE中的任何路径中找不到中的文件名,则它将扩展为零 数字0-9始终是定义的,未设置时为空,扩展结果为空 作为副作用,for变量$不能与~: 对于1中的%%$,执行echo%%~dp$失败 myBatch.bat myBatch.bat myBatch

@echo off 
set myPathVar=.
echo #0 %~$myPathVar:0
echo #1 %~$myPathVar:1
echo #2 %~$myPathVar:2
echo #3 %~$myPathVar:3
echo #4 %~$myPathVar:*
输出:

#0 C:\Temp\myBatch.bat #1 C:\Temp\myBatch.bat #2 #3 The following usage of the path operator in batch-parameter substitution is invalid: %~$myPathVar:* 这将输出定义了1和X的值

在此测试中,=undef=用作始终未定义的变量,因此没有要搜索的路径,扩展只能为空

消失的语录 这也可以用于消失引号,这是引用行的引号,但不会出现在输出中

FOR %%# in (test) DO (
  echo %%~$="=:# Disappearing quote, supports &<>| without ^ escaping
)
命令行上下文中的行为 简单百分比版本%~$PATHVARIABLE: 从不工作,因为没有有效的数字 表达式始终保持不变 对于变量版本%~$PATHVARIABLE: 只有百分之一的迹象 工作方式类似于批处理文件
如果设置/?没有回答你的问题,请更具体一些。您的代码在纯cmd中没有意义,即$PATH\u VARNAME不是cmd/batch文件语法看起来更像PowerShell@StephanPATH_VARNAME=%PATH%,顺便说一句,代码正常执行时,我看不到:2的含义:2没有任何意义,因为整个构造都没有意义。是的,它会执行,但它只是将批处理文件的第一个参数给定的变量名设置为nothing。你能展示更多的代码给它一些上下文吗?@Stephan我更新了问题,添加了一些details@Stephan:2始终在批处理脚本中定义,但从不在命令行上下文中定义,无论有多少个参数传递到批处理文件,所有参数编号都在此处定义。该构造将扩展为零或完整路径,如果%2在搜索路径中包含文件谢谢,我以为它在路径中采用第一个路径并与%2连接,但它在所有路径中搜索第二个参数并返回完整路径,最后包含第二个参数
@echo off 

FOR %%X in (test) do call :func
exit /b

:func

for %%1 in (one) do (
    if "%%~$=undef=:1" =="" echo varaible-1 is defined
    if "%%~$=undef=:2" =="" echo varaible-2 is defined
    if "%%~$=undef=:X" =="" echo varaible-X is defined
    if "%%~$=undef=:Y" =="" echo varaible-Y is defined
)
FOR %%# in (test) DO (
  echo %%~$="=:# Disappearing quote, supports &<>| without ^ escaping
)
FOR %%X in (TEST) DO (
    echo Output [percent][X] %%X -- fails, expands to TEST
    echo Output [percent][X] %%%%~$=undef=:XX
)