【问题标题】:File path as parameter - I/O Error: Couldn't open file文件路径作为参数 - I/O 错误:无法打开文件
【发布时间】:2016-11-25 19:07:13
【问题描述】:

我正在尝试使用带有文件路径作为参数的 Git Bash 打开批处理文件。我可以使用%1 获取参数。但是,当我给它路径时,我得到了这个错误:

I/O 错误:无法打开文件“C:UsersUsernameDownloadsFile.pdf”

我这样运行我的批处理:

count.bat C:\Users\Username\Downloads\File.pdf

我尝试在文件路径中将\ 替换为/,这可行,但我打算将文件拖放到命令提示符中,并且我不想替换所有反斜杠。这是我所做的:

setlocal ENABLEDELAYEDEXPANSION
set variable="%1"
call set variable=%%variable:\=/%%

pdftotext %variable% -enc UTF-8 - | wc -m

这应该用/ 替换\,但事实并非如此。执行此操作与简单执行 pdftotext %1 -enc.... 得到相同的输出。

编辑:结果 Git Bash 将 \ 视为转义字符。这意味着我不能简单地输入没有引号的路径,因为它会试图逃避它。我最终使用了 geisterfurz007 关于打开 cmd.exe 的建议,然后执行file.bat,这将在我的file.sh 文件上调用sh.exe,然后执行整个操作。一种解决方法,但至少现在可以使用 cmd。

【问题讨论】:

  • 不需要延迟扩展,也不需要 call 和 double-% 这里...有时(取决于程序)用双反斜杠替换单个反斜杠也可能会有所帮助。 ..

标签: bash batch-file


【解决方案1】:

我不确定你的问题到底是什么,但以下内容对我有用:

@echo off
setlocal EnableDelayedExpansion
set variable="%~1"
set variable=%variable:\=/%
echo %variable%

注意%~1 中的~,如果有的话,这将自动删除周围的引号。我不确定是电话还是双 % 导致了问题,但如果我没记错的话,在这种情况下不需要它们。

用法:foo.bat "C:\my Path\to\yeeeeey.file"

输出:"C:/my Path/to/yeeeeey.file"

用法:foo.bat C:\Users\Username\Downloads\File.pdf

输出:"C:/Users/Username/Downloads/File.pdf"

编辑:在与 MortenMoulder 进行较长时间的聊天后,我们找到了一种解决方法:似乎使用包含他的一个命令 pdftotext $1 -enc UTF-8 - | wc -m 的 bash 文件启动 Git-Bash 并使用批处理文件中的参数似乎有效:

批处理文件.bat:

@echo off
setlocal EnableDelayedExpansion
set variable="%~1"
set variable=%variable:\=/%
C:\Program Files\Git\bin\sh.exe C:\Users\Username\count.sh %variable%

count.sh:

pdftotext $1 -enc UTF-8 - | wc -m

【讨论】:

  • 那是因为你用双引号括住你的路径。情况并非总是如此。看看我的例子。路径没有空格,这意味着不需要双引号。
  • 不!请参阅我的编辑。启动文件时是否用引号括起来并不重要。请看一下我的代码下的第一行。如果没有引号,则不会(显然)删除任何引号,但如果有引号,则会将其删除。
  • 我没有得到和你一样的结果。唔。当我做echo %variable% 它给了我C:UsersUsernameDownloadsFile.pdf
  • 那你好像有set variable=%variable:\=%=后面缺少/)...你刚刚复制了我得到的代码吗?
  • 是的,我完全复制了你所拥有的。
猜你喜欢
  • 2021-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-21
相关资源
最近更新 更多