在Windows批处理文件中更改反斜杠以转发斜杠

时间:2014-05-08 12:58:16

标签: windows string batch-file slash

我试图将所有反斜杠()转换为包含文件名和位置的变量中的正斜杠(/)。我已经读到了这个并看到了:

%variable:str1=str2%

set "var=%var:\=/%"

我试过,但我显然没有做对。

以下是我的.bat脚本的相关部分:

FOR %%f IN ("E:\myfiles\app1\data\*.csv") DO (
  echo %%f  
  set "f=%%f:\=/%"
  echo %%f  
  echo.                 
)

输出显示每个文件名列出两次。

即。这一行:

set "f=f:\=/%"

没有按照我的意愿行事。谁能看到我做错了什么?

5 个答案:

答案 0 :(得分:55)

这会将变量的反斜杠更改为正斜杠:

set "variable=E:\myfiles\app1\data\*.csv"
set "variable=%variable:\=/%"
echo "%variable%"

答案 1 :(得分:20)

在块语句(a parenthesised series of statements)中,解析整个块并执行然后。块中的任何%var%将在解析块时被该变量的值替换 - 在块执行之前 - 同样的事情适用于{{1 }}

因此,FOR ... DO (block)将在遇到IF (something) else (somethingelse)时使用%variables%的值执行。

解决此问题的两种常见方法是1)使用IF并使用setlocal enabledelayedexpansion代替!var!来访问已更改的%var%或2}值以进行调用一个子程序,用于使用更改的值执行进一步处理。

请注意使用var显示CALL ECHO %%var%%

的更改值

您的代码包含两个名为var的独立变量。

第一个是循环控制'元变量'名为f,由f引用。

第二个是由%%f语句建立的公共环境变量f。可以使用set "f=..."中的%f% 来访问此变量,它似乎会保留解析控件block时的值(事实上) ,任何for在解析时被%var% 的值替换

var不能用于字符串操作语句(如子字符串或替换语句),只有公共环境变量可用于这些操作,因此需要将元变量metavariables的值赋给环境变量f然后执行环境变量f的字符串替换任务。

当然,扭曲是您必须使用fdelayedexpansion语法来访问块中环境变量的修改值。

所以,

!var!

这会以所需方式设置setlocal enabledelayedexpansion for...%%f...do ( echo %%f set "f=%%f" set "f=!f:\=/!" echo !f! ) echo just for demonstration %f% !f! %%f 的值(当然,您可以随时更改名称以避免混淆......)

最后一行只是为了表明f获取的最终值可以在循环之外以f%f%的形式访问,而!f!%%f超出上下文并显示为%f

在没有delayedexpansion的情况下执行此操作的另一种方法是

for...%%f...do (
  echo %%f
  set "f=%%f"
  call set "f=%%f:\=/%%"
  call echo %%f%%
)
echo just for demonstration %f% !f! %%f

区别在于使用call并将%加倍,最后一行将!f!显示为 - delayedexpansion以外的!模式,cmd只是另一个对{{1}}没有特殊含义的字符。

答案 2 :(得分:4)

这似乎对我有用:

echo off

setlocal enabledelayedexpansion

FOR %%f IN ("C:\tools\workspace\*") DO (
  set old=%%f
  echo !old!
  set new=!old:\=/!
  echo !new!  
  echo.                 
)

使用单独的变量而不是循环变量会产生差异,同时启用延迟扩展,因为变量替换syntex使用循环变量%% f dos似乎不起作用。

答案 3 :(得分:0)

Magoo's helpful answer显示了如何在for循环的(...)块内执行动态替换(通过延迟扩展)。

foxidrive's answer显示了用于在变量值中执行文字,全局字符串替换的通用cmd语法(在问题中也已简要显示)。

让我用使用PowerShell's CLI 的解决方案补充这些答案:

注意:

  • 在当前的简单情况下,这是过大的,并且比纯cmd解决方案还差。

  • 但是,如果您需要更复杂的,基于正则表达式的字符串替换,则该技术可以有用,通过PowerShell的基于正则表达式的-replace

@echo off

:: Sample path.
Set inPath=C:\foo\bar

for /f "usebackq delims=" %%i in (
  `powershell -noprofile -c "\"%inPath%\" -replace '\\', '/'"`
) do set "outPath=%%i"

echo %outPath%

以上结果:

C:/foo/bar

在线变量,直接嵌入输入路径并直接输出转换后的字符串:

C:\>powershell -noprofile -c "\"C:\foo\bar\" -replace '\\', '/'"
C:/foo/bar

答案 4 :(得分:-1)

这将适用于将反斜杠更改为Windows中的正斜杠:

 typedef std::basic_string<TCHAR> tstring;
 tstring pathbasic = tstring(programdata) + _T("\\myfile.txt");
 std::replace(pathbasic.begin(), pathbasic.end(), _T('\\'), _T('/'));