Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.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
For loop 防止Windows命令解释器(FOR)将列表视为通配符?_For Loop_Batch File_Wildcard_Command Prompt_Wildcard Expansion - Fatal编程技术网

For loop 防止Windows命令解释器(FOR)将列表视为通配符?

For loop 防止Windows命令解释器(FOR)将列表视为通配符?,for-loop,batch-file,wildcard,command-prompt,wildcard-expansion,For Loop,Batch File,Wildcard,Command Prompt,Wildcard Expansion,我正在尝试编写一个批处理文件,该文件包含两个参数,后跟一个或多个可选文件名(可能包括通配符),并在某个时候处理每个可选文件名,但是for命令一直试图展开它们,因此即使只是打印它们也无法工作 我查看了帮助(以获取/?),但似乎没有任何开关可以阻止此操作。我尝试使用单引号、双引号和反引号以及/f,但似乎没有任何效果 以下命令按预期工作: > for %i in (foo bar baz) do @echo %i foo bar baz 以下命令不适用: > for %i in (foo

我正在尝试编写一个批处理文件,该文件包含两个参数,后跟一个或多个可选文件名(可能包括通配符),并在某个时候处理每个可选文件名,但是
for
命令一直试图展开它们,因此即使只是打印它们也无法工作

我查看了帮助(
以获取/?
),但似乎没有任何开关可以阻止此操作。我尝试使用单引号、双引号和反引号以及
/f
,但似乎没有任何效果

以下命令按预期工作:

> for %i in (foo bar baz) do @echo %i
foo
bar
baz
以下命令不适用:

> for %i in (foo bar baz really?) do @echo %i
foo
bar
baz
以下情况更是如此:

> ren > reallyz
The syntax of the command is incorrect.

> dir /b really*
reallyz

> for %i in (foo bar baz really?) do @echo %i
foo
bar
baz
reallyz

是否有办法让Windows命令解释器将传递的列表视为字符串,而不是试图将其解释为文件名通配符?

否-simple FOR命令将始终展开
*
通配符

你需要使用一个GOTO循环来做你想做的事情。SHIFT命令允许访问所有参数

@echo off
:argLoop
if "%~1" neq "" (
  echo %1
  shift /1
  goto :argLoop
)
很可能您想对参数做更多的处理,然后只需打印它们。通常,您会将它们存储在变量的“数组”中,以供以后使用

@echo off
setlocal

set argCnt=1
:argLoop
if "%~1" neq "" (
  set "arg.%argCnt%=%~1"
  set /a argCnt+=1
  shift /1
  goto :argLoop
)
set /a argCnt-=1

:: Show Args
setlocal enableDelayedExpansion
for /l %%N in (1 1 %argCnt%) do echo arg.%%N = !arg.%%N!

否-simple FOR命令将始终展开
*
通配符

你需要使用一个GOTO循环来做你想做的事情。SHIFT命令允许访问所有参数

@echo off
:argLoop
if "%~1" neq "" (
  echo %1
  shift /1
  goto :argLoop
)
很可能您想对参数做更多的处理,然后只需打印它们。通常,您会将它们存储在变量的“数组”中,以供以后使用

@echo off
setlocal

set argCnt=1
:argLoop
if "%~1" neq "" (
  set "arg.%argCnt%=%~1"
  set /a argCnt+=1
  shift /1
  goto :argLoop
)
set /a argCnt-=1

:: Show Args
setlocal enableDelayedExpansion
for /l %%N in (1 1 %argCnt%) do echo arg.%%N = !arg.%%N!

您是否尝试过使用插入符号“^”来转义问号,如(foo-bar-baz真的^?)中所示。您可能需要对其进行处理,因为Windows对转义字符的概念非常复杂,在命令行上运行与从批处理文件运行时,转义字符似乎会发生变化。是的,转义不起作用(此外,即使这样做了,用户也必须记住在调用批处理文件时转义它们,这当然是一个不理想的界面,因为它与传递文件名的其他用法不一致)。您是否尝试过用插入符号“^”转义问号,如(foo-bar-baz真的^?)你可能不得不摆弄它,因为Windows对转义字符的概念很复杂,在命令行上运行与从批处理文件运行时,转义字符似乎会发生变化。是的,转义字符不起作用(此外,即使这样做了,那么用户在调用批处理文件时也必须记住转义它们,这当然是一个不理想的界面,因为它与传递文件名的其他用途不一致)。这很好,我已经考虑过了,但使用
shift
是不可撤销的(它永久地移动参数,并且没有
/reset
开关或接受负参数),因此我以后无法在批处理文件中访问它们(即前两个必需参数)。我想我也可以将前两个参数推送到env vars,但因为我需要使用路径字符串选项(
%~dp1
%~n2
…),将它们放在环境变量中是不愉快的(你不能用变量来做这件事,也就是说,
%~nfoobar%
由于明显的原因不起作用)。我必须为运行另一个
,但值得一试…@Synetech-是的,这就是我建议将值存储在变量中的原因。附加for循环冗长,但速度很快。如果您提前知道需要哪些变量,可以保存值的多个副本,每个副本具有不同的扩展修饰符。Okay,它看起来很有效。我更改了可选arg循环的开始索引。我还必须使用双for循环来访问前两个参数中的每一个(例如,
for/l%%I in(2,1,2)do for%%j in(!arg.%%I!)do echo[%%~pnj]
for第二个),但至少它有效。(这严重地把本来应该是一个相对简单的批处理文件复杂化,但它比我编写一个完整的、编译的C++程序要简单得多。我必须研究Zip、7zip等功能。至少,这是很好的,我已经考虑过了,但是使用<代码>移位<代码>是不可撤销的。(它永久地移动参数,并且没有
/reset
开关或接受负参数),因此我以后无法在批处理文件中访问它们(即前两个必需参数)。我想我也可以将前两个参数推送到env vars,但因为我需要使用路径字符串选项(
%~dp1
%~n2
…),将它们放在环境变量中是不愉快的(你不能用变量来做这件事,也就是说,
%~nfoobar%
由于明显的原因不起作用)。我必须为
运行另一个
,但值得一试…@Synetech-是的,这就是我建议将值存储在变量中的原因。附加for循环冗长,但速度很快。如果您提前知道需要哪些变量,可以保存值的多个副本,每个副本具有不同的扩展修饰符。Okay,它看起来很有效。我更改了可选arg循环的开始索引。我还必须使用双for循环来访问前两个参数中的每一个(例如,
for/l%%I in(2,1,2)do for%%j in(!arg.%%I!)do echo[%%~pnj]
for第二个),但至少它有效。(这严重复杂了本来应该是一个相对简单的批处理文件,但它比我编写一个完整的编译的C++程序要简单得多,我必须研究ZIP、7Zip等功能。