关于%*
,有关批处理文件参数的问题和答案很多,但我没有找到答案。
批处理文件中是否存在可以与Unix中的“$ @”执行相同行为的等效语法?
某些背景信息:
@echo off
set MYPATH=%~dp0
set PYTHON=%MYPATH%..\python\python
set BASENAME=%~n0
set XTPY=%MYPATH%..\SGTools\bin\%BASENAME%.py
"%PYTHON%" "%XTPY%" %*
这是用于调用Python脚本的代理的.bat文件。所以我将所有参数(脚本名称除外)传递给Python脚本。这样可以正常工作,直到引号中有参数和/或包含空格。
在shell脚本中,您可以使用“$ @”获取每个参数并将其括在引号中。我能做些什么来复制这个过程吗?
示例电话:
xt -T sg -t "path with possible spaces" -sum "name with spaces" -p <tool_name> -o lin32 lin64 win32 <lots of other options with possibilities of spaces>
命令/文件xt
只包含上面列出的代码,因为实际的可执行文件是不同文件夹中的Python代码。所以重点是创建一个自包含的包,只需在路径中添加一个目录(xbin目录)。
答案 0 :(得分:4)
我不确定最干净的解决方案是什么,但这是我解决问题的方法:
setlocal EnableDelayedExpansion
for %%i in (%*) do set _args= !_args! "%%~i"
echo %_args%
%_ args%现在将包含每个参数的引用列表。例如,如果您按如下方式调用批处理文件:
MYBATFILE "test'1'file" "test'2'file" "test 3 file"`
echo%_args%
将生成原始引用的输入。
我需要这个用于CMD文件,这些文件采用不友好的文件或目录名称并将它们传递给Cygwin Bash shell脚本,这些脚本完成了繁重的工作,但我无法承受在转换中丢失嵌入的单引号或空格。 / p>
请注意 %% ~i%中的 ~i ,这是在我们应用引号之前删除引号所必需的。当传递包含空格的参数时(例如,上面的“测试3文件”),CMD shell将已经应用了引号。这里的波形符号确保我们不会引用包含空格的参数。