在批处理脚本中将带或不带空格的文件路径传递给 cygwin .." ' \ 混淆

涩有

经过数小时和无数次将“和”放在我可以想象的任何地方并试图找到有关如何处理我正在尝试做的事情的资源后,我迷失在比开始尝试之前更多的混乱中。不幸的是,我对 Windows 中的批处理脚本非常陌生。

我正在尝试编写一个批处理脚本,它将Windows 文件路径作为可以包含或不包含空格的参数。然后应该将该文件路径传递给 cygwin 内的命令,然后将输出(只是修改后的文件路径(仍然是Windows 文件路径))分配给批处理脚本中的变量。

如果文件路径没有空格,我就让它完全工作。但我不知道如何用空格来做。我看到 "s 神奇地出现,\s 有时消失,有时没有......我能得到的最远是这样的:

@echo off
set "a=%1"
for /f "delims=" %%i in ('C:\cygwin64\bin\bash --login -c "echo '%a%'"') do set "newpath=%%i"
echo %newpath%
pause

适用于没有空格的文件路径(注意 %a% 左右)。对于带有空格的路径,我收到类似的语法错误

-c: line 0: unexpected EOF while searching for `''
-c: line 1: syntax error: unexpected EOF

(翻译,因为我的系统不是英文)。如果我删除 %a% 附近的 's,文件路径中的所有 \s 都会消失(正如 cygwin echo 所预期的那样)并且间隔的文件路径在第一个空格之后被切断。如果我用 "s 代替 's,就像这样

@echo off
set "a=%1"
for /f "delims=" %%i in ('C:\cygwin64\bin\bash --login -c "echo "%a%""') do set "newpath=%%i"
echo %newpath%
pause

然后它用于路径空间,而不是那些没有(所有\ S消失)。在这一点上,我很困惑发生了什么。

显然,我想将包括单引号在内的文字 'windows\file\path' 传递给 cygwin,因为那时 's 中的所有内容都被视为文字。根据一些在线资源, ' in batch 没有特殊含义,除了在我写的这个特殊的 /f 中。但是,即使我删除了 for /f 和变量赋值,并尝试直接回显,我也会得到类似的奇怪行为,这无助于我理解任何事情。

任何人都可以帮忙,我如何实现我想要做的事情(上面斜体)?


编辑

做了一些进一步的测试,我想我现在理解了这种行为,但我仍然不知道如何实现我想要的。

所以,在批处理脚本中,如果我传递一个没有空格的路径,变量包含

C:\some\path\without\space

但是如果我传递一个空格的路径,变量包含

"C:\some\path with space"

即在第二种情况下,“s 包含在变量中。所以如果我将前者传递给 cygwin echo,我得到

echo C:\some\path\without\space

这将输出

C:somepathwithoutspace

正如预期的那样。如果我通过第二个版本

echo "C:\some\path with space"

输出是

C:\some\path with space

再次如预期。同样,如果我在批处理脚本中的变量周围添加 "s,cygwin echo 只会传递那些额外的 "s,这会导致交换行为,非空格路径会正确输出,而带有空格的路径会失败,因为"" 只是 bash 中的空字符串。

恕我直言,这种行为非常……愚蠢。为了实现我想要的,我需要以某种方式确定变量的内容是否已经被引用,并在必要时添加引号。


可能不重要,但要回答评论中的问题,我想要做的当然不仅仅是使用 echo,而是使用我传递给它的路径执行某些操作的各种 bash 脚本。最后,我想要一个可以在 Windows 中快速运行的程序/可能会添加到我的上下文菜单中,因此在 cygwin bash 中执行所有操作都违背了使最终程序快速可用的目的,或者至少我不知道如何至。我没有在批处理脚本中做所有事情的原因是我根本不知道批处理脚本,我只是为了制作一个快速访问的程序而使用我必须的最低限度;同时在 bash 中做本质,因为我已经知道如何了。

例如,我在某处有一个 .zip 文件,我想将其解压缩、计算文件、对文件运行一些 linux 命令(如转换)、分析文件名、修改文件名,最后在修改后的文件上运行另一个 Windows 程序文件。中间步骤已经需要一些linux工具;加上所有的文件处理,我不知道如何批量处理,但在 bash 中很容易。

我唯一的问题是这个问题,因为我想在我想使用该程序的存档恰好是的任何目录中运行最终程序,即它可以或不能在文件路径中有空格。

涩有

结果我只需要像这样读取传递的文件路径

@echo off
set "path=%~1"
for /f "delims=" %%i in ('C\cygwin64\bin\bash --login -c "./some/script.sh ""%path%"""') do set "outvar=%%i"
:: do more things ..

我用过的地方

%~1

代替

%1

读取我的文件路径参数。这可以防止在变量的内容中出现任何 "s,所以我总是可以在将它传递给 cygwin 时添加文字引号,方法是使用转义双引号

""

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

Related 相关文章

热门标签

归档