4

我不幸使用了一个程序,该程序要求传递给它的所有文件名都是有效的 URL。(不,我不知道为什么。)我不必file:每次都拖放到命令行和手工制作 URL,而是将一个批处理文件放在一起,我可以简单地将文件从 Windows GUI 拖放到该批处理文件上。

一个完整的、正确的 URL 编码器超出了我的需要或兴趣(无论如何,应用程序阻塞的大多数字符在 Windows 文件名中都无效),但我需要解决的两种情况是反斜杠和空格。反斜杠很容易通过变量替换语法 ( SET URL=%URL:\=/%) 处理,但空格很棘手——%对于 URL 和批处理文件来说都是特殊的。

我熟悉的两种类型的批处理转义 ( ^%, %%) 都不允许变量替换按预期运行,而且我在谷歌搜索解决方案方面没有任何成功。任何批次大师可以帮助我吗?

这是我到目前为止所拥有的:

@ECHO OFF

SETLOCAL

SET URLPATH=file:/%~dp1
SET URLPATH=%URLPATH:\=/%

REM none of these work
REM SET URLPATH=%URLPATH: =%20%
REM SET URLPATH=%URLPATH: =%%20%
REM SET URLPATH=%URLPATH: =^%20%

REM works; I just need to figure out how to generate it
SET URLPATH=file:/C:/Documents%%20and%%20Settings/bblank/example.dat

stupidapp.exe %URLPATH%

ENDLOCAL
4

2 回答 2

3

旁注 - 我相信你想要%~f1而不是%~dp1

您需要切换到延迟扩展。

@echo off
setlocal enableDelayedExpansion

set "URLPATH=file:/%~f1"
set "URLPATH=!URLPATH:\=/!"
set "URLPATH=!URLPATH: =%%20!"
stupidapp.exe !URLPATH!

endlocal

如果您的任何文件名碰巧包含该字符,则需要做更多的工作,!因为如果启用了延迟扩展,则在扩展 %1 时它将被损坏。

@echo off
setlocal disableDelayedExpansion
set "URLPATH=file:/%~f1"
setlocal enableDelayedExpansion
set "URLPATH=!URLPATH:\=/!"
set "URLPATH=!URLPATH: =%%20!"
stupidapp.exe !URLPATH!

endlocal
endlocal
于 2012-04-18T22:42:27.883 回答
2

dbenham 的解决方案几乎肯定更可取(更容易阅读),但为了完整起见,这里有一个替代解决方案:

SET URLPATH=file:/%~dp1
SET URLPATH=%URLPATH:\=/%

REM for each space in the path, split the path into the portions before and after
REM that space, then join them with an escaped space
:ESCAPE_SPACE
SET TRAILING=%URLPATH:* =%
CALL SET URLPATH=%%URLPATH: %TRAILING%=%%
SET URLPATH=%URLPATH%%%20%TRAILING%
IF NOT "%URLPATH%"=="%URLPATH: =%" GOTO ESCAPE_SPACE

stupidapp.exe %URLPATH%
于 2012-04-19T00:01:44.673 回答