【问题标题】:How to remove the base path from the full path using windows batch [duplicate]如何使用 Windows 批处理从完整路径中删除基本路径 [重复]
【发布时间】:2016-02-10 15:06:12
【问题描述】:

我有完整路径(使用 "%%~fl" 或 %%~l)

E:\Documents\Windows-Bash\CheckModels\SB3\models\TEST3\Cerus\Modbridge\Core\g-221.mdl

我的基本路径(根据 %~dp0 )是:

E:\Documents\Windows-Bash\CheckModels\SB3\

如何提取:

models/TEST3/Cerus/Modbridge/Core/g-221.mdl

在文本文件中搜索它。

我的批处理脚本如下:

echo off

set DataBase=E:\Documents\Windows-Bash\CheckModels\SB3\DB\trackassembly_init.lua
set AddModel=models_present.txt
set MisModel=models_missing.txt
set BasePath=%~dp0
set Model

dir /a-d /b /s *.mdl > %AddModel%

for /F "tokens=*" %%l in ('type "%AddModel%"') do (
  set Model=%%~l 
  :: ?[1] Process the %Model% so it becomes "models/TEST3/Cerus/Modbridge/Core/g-221.mdl"
  :: ?[2] IF (not found %Model% in the contents of %DataBase% ) THEN
  :: ?[2]    echo Model > MisModel ( Append missing file )
  :: ?[2] END
)

del %AddModel%

echo End
timeout 25

如何用真实的东西替换 ?[1] 和 ?[2] 中的伪代码? 我可以使用 C/C++ 轻松转换字符串,但不需要其他文件。有没有办法将整个东西转换为 C/C++ ?

【问题讨论】:

  • 您似乎对这里的术语感到困惑。 Bash 是一个 Unix shell;它当然也存在于 Windows 端口中,但是您显示的代码绝对不是 bash 代码。我编辑了你的问题来解决这个明显的困惑。
  • 是的,也许。从 Windows BATCH 开始,它是一个“BAT”文件。一个包含dos命令的文件,告诉windows该做什么......我可能会尝试用C++来做整个瘦,但我认为这种方式更干净......
  • 您可以使用 set 命令进行字符串替换,以删除批处理文件所在文件名的部分路径。
  • 我猜 Magoo 在下面发布了什么,但不知何故我无法让它工作.. 抱歉 Squashman 提出了这个愚蠢的问题,但我应该怎么做?
  • 已经用 C++ 和一批。你批量调用 C++ 应用程序并完成...

标签: windows batch-file str-replace


【解决方案1】:
@ECHO Off
SETLOCAL
SET "basepath=u:\sourcedir\t w o"
PUSHD "%basepath%"
for /F "tokens=*" %%l in ('dir /a-d /b /s *.mdl ') do (
 set "Model=%%~l"
 call set "relpath=%%model:*%basepath%\=%%"
 call set "relpath=%%relpath:\=/%%"
 CALL echo %%relpath%% FOR %%l
)
popd
GOTO :EOF

注意引号的位置以确保分配的值不包括源代码中的杂散尾随空格(很难找到它们是否存在)

basepath 是目录扫描的相对根。更改以适合自己 - 我使用了适合我系统的目录。

call 执行 set 命令并替换了单% 变量。

设置 "var1=%var2:string1*=string2%"

var1 设置为var2 的值,将string1 之前的字符(包括string1)替换为string2

【讨论】:

  • 它在 Windows 7 上不起作用。"for /F "tokens=*" %%l in ('dir /a-d /b /s *.mdl ') do" 每次输出相同的文件迭代 _echo %%l _set "Model=%%l" _call echo %Model% >> %LogModel% _call set "Relpath=%%Model:%BasePath%*=%%" _call echo 。 >> %LogModel% _call echo %Relpath% >> %LogModel% _call echo 。 >> %LogModel% _call 回声。 >> %LogModel% 当我在每次迭代中打印模型时都会给我相同的文件,而在 %LogModel% 中我会得到完全相同的文件。另一方面,“echo %%l”打印它应该是什么..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-19
  • 2018-12-02
相关资源
最近更新 更多