如何从批处理脚本中的文件路径中删除最后一个“\”

Posted

技术标签:

【中文标题】如何从批处理脚本中的文件路径中删除最后一个“\\”【英文标题】:How can I delete last "\" from file's path in batch script如何从批处理脚本中的文件路径中删除最后一个“\” 【发布时间】:2021-09-08 14:49:37 【问题描述】:

我正在尝试这个,它会在我复制文件路径(Shift+右键单击>复制为路径)并将其放入批处理文件后计算文件的行,但是....我该如何解决? %path% 中的最后一个 \ 导致问题。

@echo off
Setlocal EnableDelayedExpansion
set /p ifilename=Enter file name:
for %%f in (%ifilename%) do (
set paath=%%~df%%~pf
set ifilename=%%~nf%%~xf
)
echo %paath%
echo %ifilename%

for /f "usebackq" %%a in (`dir /b /s %1 "%paath%"`)  do (
  for /f "usebackq" %%b in (`type %ifilename% ^| find "" /v /c`) do (
set lines= %%b
)
)
echo %lines%
pause

【问题讨论】:

真正的问题是set path=%%~df%%~pf,它重新定义了预定义的环境变量PATH,这是一个非常重要预定义的Windows Environment Variables,如我在@ 的回答中详细描述的那样987654322@ 确保永远不要在命令提示符窗口set 中运行时无意中重新定义其中一个预定义的 Windows 环境变量输出。 命令DIR绝对没有问题递归列出指定目录中的所有目录和文件,该目录的路径以反斜杠结尾。但是cmd.exeset path=%%~df%%~pf 之后搜索名称为find 的文件时不再找到%SystemRoot%\System32\find.exe。我建议将此行更改为set "FilePath=%%~dpf"。请打开command prompt,运行for/?,并从第一页顶部到最后一页底部仔细完整地阅读输出帮助。对 dir /?set /? 执行相同操作。 我会更具体,第一个我是新手,第二个是,如果我输入 C:\tools\xe.txt 这个,%%~dpf 将是C:\tools** 所以如果我把它放在 *path 位置,它会说错误。但是,如果我将 C:\tools 放在路径中它可以工作,所以我需要的是,如何删除最后一个“\”形式,无论路径是什么,制作这个 C:\tools*进入 *C:\toolsC:\tools\New folder\New folder* 进入 **C:\tools\New folder\New folder删除反斜杠 从不覆盖系统变量PATH!改用另一个名字!修饰符 ~p 总是返回带有尾随 \ 的路径,但这通常不会造成伤害;如果在特定情况下确实如此,只需附加一个.,因为\abc\. 相当于\abc... 关于如何使用批处理文件的描述对我来说很清楚,但没有关于批处理文件应该做什么的描述。这对于批处理文件编码专家来说通常是没有问题的,但是您的批处理文件有很多错误,至少对我来说不清楚批处理文件应该做什么。 dir /b /s %1 "%path%" 的目标是什么? %1 引用了传递给批处理文件的第一个参数。没有任何关于使用参数调用批处理文件的文章。 【参考方案1】:

>> %path% 中的最后一个 \ 导致问题 这个很容易解决,代码是:

set TempDir=C:\0TEMP
@echo off
md %TempDir%
cd /d  %TempDir%

::------

@echo off
@echo on
Setlocal EnableDelayedExpansion

::set /p ifilename=Enter file name:
SET DUMMYexe=%TempDir%\DUMMY.exe
IF EXIST "%DUMMYexe%" goto ll123
ECHO ---------writing
pause
(
  ECHO pause1
  ECHO pause2
  ECHO pause3
) > %DUMMYexe%
:ll123
SET ifilename=%DUMMYexe%

for %%f in (%ifilename%) do (
set fpath=%%~df%%~pf
set ifilename=%%~nf%%~xf
)
echo %fpath%
echo %ifilename%

SET v=asdf1234
SET vv=\%v%
SET vvv=%fpath%%vv%

CALL SET v=%%vvv:\%vv%=%%
echo 111---%v%

pause
set fpath=%v%


for /f "usebackq" %%a in (`dir /b /s %1 "%fpath%"`)  do (
  for /f "usebackq" %%b in (`type %ifilename% ^| find "" /v /c`) do (
set lines= %%b
)
)
echo %lines%
echo on
pause
goto

当然,如果我使用 var 'path',我的 win10 会报告: 'find' 不是内部或外部命令、可运行程序或批处理文件。

顺便说一句,也许你会对下面的代码感兴趣:


SETLOCAL ENABLEDELAYEDEXPANSION
SET count=1
FOR /F "tokens=* USEBACKQ" %%F IN (`dir `) DO (
  SET var!count!=%%F
  SET /a count=!count!+1
)
ECHO -------------- %count%
ECHO
ECHO %var1%
ECHO %var2%
ECHO %var3%
ENDLOCAL
pause

我在复制后测试的:How to set commands output as a variable in a batch file

关于“Setlocal EnableDelayedExpansion”的非常有用的信息可以在以下位置找到:How do SETLOCAL and ENABLEDELAYEDEXPANSION work?

【讨论】:

以上是关于如何从批处理脚本中的文件路径中删除最后一个“\”的主要内容,如果未能解决你的问题,请参考以下文章

拆分路径并在批处理脚本中取最后一个文件夹名称

如何创建SSIS脚本任务以从平面文件中删除CR LF

最后一个参数中的正斜杠导致批处理文件目录的路径(“%~dp0”)改变

Shell如何实现从文件中的第n行开始读取记录?

从批处理文件输入中删除尾部斜杠

如何从shell脚本中的另一个目录获取文件的完整路径? [复制]