Board logo

标题: [文本处理] 批处理for & dir命令,路径带有空格,怎么解决? [打印本页]

作者: bcetl    时间: 2022-3-30 11:55     标题: 求帮助,批处理for循环前面 加上if后,变闪退。

以下脚本能正常收集mp4、mp3文件名单
  1. set /p folder=
  2. for /f "delims=" %%a in ('dir /b/a-d/oN %folder%\*.mp4 %folder%\*.mp3') do (
  3. echo %%~na>> "%folder%"\%date:~5,2%-%date:~8,2%.txt
  4. echo %%~xa>> "%folder%"\%date:~5,2%-%date:~8,2%.txt
  5. for /f "tokens=1-2 delims=-" %%i in ("%%~na") do (echo %%j>> "%folder%"\纯歌名%date:~5,2%-%date:~8,2%.txt
  6. )
  7. ping -n 3 127.0.0.1 1>nul 2>nul
  8. cls
  9. @echo    已成功将 "%folder%" 音视频收集,文本位于该目录下的 "%date:~5,2%-%date:~8,2%.txt" 文档内
  10. goto :sss
复制代码
以下是加上if判断为mp3曲目后,变闪退。如何更正呢?目的是达到歌曲名为英文时,单独罗列出来,以便后续翻译用
  1. set /p folder=
  2. for /f "delims=" %%a in ('dir /b/a-d/oN %folder%\*.mp4 %folder%\*.mp3') do (
  3. echo %%~na>> "%folder%"\%date:~5,2%-%date:~8,2%.txt
  4. echo %%~xa>> "%folder%"\%date:~5,2%-%date:~8,2%.txt
  5. if %%~xa=mp3 (for /f "tokens=1-2 delims=-" %%i in ("%%~na") do (echo %%j>> "%folder%"\纯歌名%date:~5,2%-%date:~8,2%.txt)
  6. )
  7. ping -n 3 127.0.0.1 1>nul 2>nul
  8. cls
  9. @echo    已成功将 "%folder%" 音视频收集,文本位于该目录下的 "%date:~5,2%-%date:~8,2%.txt" 文档内
  10. goto :sss
复制代码

作者: bcetl    时间: 2022-3-30 12:12

另外路径带有空格,也会闪退,试过几种方法,没法解决。
set /p folder=
for /f "delims=" %%a in ('dir /b/a-d/oN %folder%\*.mp4 %folder%\*.mp3') do (



('dir /b/a-d/oN %folder%\*.mp4 %folder%\*.mp3')里面的路径,不知道怎么加引号才对
作者: buyiyang    时间: 2022-3-30 12:33

本帖最后由 buyiyang 于 2022-3-30 12:35 编辑

我有个问题,if比较字符串不应该用==吗?另外路径有空格可以加上usebackq,形式如for /f "usebackq" %%i in ("文件名") do (……)
详细参见:http://www.bathome.net/thread-2189-1-1.html
作者: qixiaobin0715    时间: 2022-3-30 12:47

  1. if "%%~xa"==".mp3"...
复制代码
  1. set /p folder=
  2. for /f "delims=" %%a in ('dir /b/a-d/oN "%folder%\*.mp4" "%folder%\*.mp3"') do...
复制代码

作者: bcetl    时间: 2022-3-30 12:55

回复 4# qixiaobin0715


    谢谢亲,if的问题解决了。可是路径有空格的
试过:for /f "delims=" %%a in ('dir /b/a-d/oN "%folder%\*.mp4" "%folder%\*.mp3"') do (


还是会闪退
作者: bcetl    时间: 2022-3-30 13:06

回复 3# buyiyang


    谢谢亲,可我加了也没用哦。

for /f "usebackq" %%a in ('dir /b/a-d/oN "%folder%\*.mp4" "%folder%\*.mp3"') do (
作者: bcetl    时间: 2022-3-30 13:23     标题: 批处理for & dir命令,路径带有空格,怎么解决?

for /f "delims=" %%a in ('dir /b/a-d/oN %folder%\*.mp4 %folder%\*.mp3') do (

for /f "delims=" %%a in ('dir /b/a-d/oN "%folder%"\*.mp4 "%folder%"\*.mp3') do (


for /f "delims=" %%a in ('dir /b/a-d/oN "%folder%\*.mp4" "%folder%\*.mp3"') do (

for /f "usebackq" %%a in ('dir /b/a-d/oN "%folder%\*.mp4" "%folder%\*.mp3"') do (

for /f "usebackq" %%a in ('dir /b/a-d/oN ""%folder%"\*.mp4" ""%folder%"\*.mp3"') do (

以上几种方法都试了,不会闪退,但无效,不能正常识别路径。只在目录的旁边生成部分无后缀名的文件。例如“喜庆 音乐”旁边生成“喜庆”无扩展名的日志类文档
作者: buyiyang    时间: 2022-3-30 13:45

本帖最后由 buyiyang 于 2022-3-30 14:12 编辑

回复 6# bcetl


    不好意思,我看错了,这个是命令里的路径,这个引号加到全部路径或者一级一级地加应该都可以,不要把一级的目录用引号隔开了
  1. for /f "delims=" %%a in ('dir /b/a-d/oN "%folder%"\"*.mp4%folder%"\*.mp3')
  2. 或者
  3. for /f "delims=" %%a in ('dir /b/a-d/oN "%folder%\*.mp4"  "%folder%\*.mp3"')
复制代码

作者: bcetl    时间: 2022-3-30 13:50

回复 7# buyiyang


   

谢谢大神,我试了以下几种,都无效。
for /f "delims=" %%a in ('dir /b/a-d/oN %folder%\*.mp4 %folder%\*.mp3') do (

for /f "delims=" %%a in ('dir /b/a-d/oN "%folder%"\*.mp4 "%folder%"\*.mp3') do (


for /f "delims=" %%a in ('dir /b/a-d/oN "%folder%\*.mp4" "%folder%\*.mp3"') do (

for /f "usebackq" %%a in ('dir /b/a-d/oN "%folder%\*.mp4" "%folder%\*.mp3"') do (

for /f "usebackq" %%a in ('dir /b/a-d/oN ""%folder%"\*.mp4" ""%folder%"\*.mp3"') do (


例如只会在“C:\喜庆 音乐”旁边,即C:\目录下生成“喜庆”无扩展名的日志类文档
作者: Batcher    时间: 2022-3-30 13:53

回复 7# buyiyang


    建议以后不要一级一级地加,整体加一对就够了。
作者: buyiyang    时间: 2022-3-30 13:55

本帖最后由 buyiyang 于 2022-3-30 14:11 编辑

回复 8# bcetl


    我说了,不要把一级的目录隔开了,你几个刚好都隔开了,应该是"%folder%"\"*.mp4"  "%folder%"\*.mp3
作者: Batcher    时间: 2022-3-30 13:55

回复 5# bcetl


建议以后不要再说“不行”、“一闪而过”、“没有反应”之类的话,因为这对于想要给你进一步帮助的人来说没有任何意义。希望大家都能学会的一个知识点是:如何查看代码的执行过程和报错信息。

请参考Q-01观察一下哪行代码在报错以及详细的报错信息,如无报错请发执行过程:
https://mp.weixin.qq.com/s/6lbb97qUOs1sTyKJfN0ZEQ

如需上传截图,请用图床:
http://bbs.bathome.net/thread-60985-1-1.html

如需上传附件,请用阿里云盘或百度网盘。
作者: buyiyang    时间: 2022-3-30 14:04

本帖最后由 buyiyang 于 2022-3-30 14:09 编辑

回复 1# bcetl


    在全部路径上加一对引号就可以,第三个应该是对的
作者: Batcher    时间: 2022-3-30 14:07

回复 1# bcetl
  1. set /p "folder="
  2. if not exist "%folder%" (
  3.     echo 找不到文件夹 "%folder%"
  4.     pause
  5.     goto :eof
  6. )
  7. for /f "delims=" %%a in ('dir /b /a-d /oN "%folder%\*.mp4" "%folder%\*.mp3"') do (
  8.     >> "%folder%\%date:~5,2%-%date:~8,2%.txt" echo,%%~na
  9.     >> "%folder%\%date:~5,2%-%date:~8,2%.txt" echo,%%~xa
  10.     if /i "%%~xa" equ ".mp3" (
  11.         for /f "tokens=1-2 delims=-" %%i in ("%%~na") do (
  12.             >> "%folder%\纯歌名%date:~5,2%-%date:~8,2%.txt" echo,%%j
  13.         )
  14.     )
  15. )
复制代码

作者: bcetl    时间: 2022-3-30 14:18

回复 11# buyiyang


    好的,谢谢大神
作者: bcetl    时间: 2022-3-30 14:18

回复 12# Batcher


    好的,谢谢。已解决了。
作者: bcetl    时间: 2022-3-30 14:23

本帖最后由 bcetl 于 2022-3-30 14:24 编辑

回复 11# buyiyang

回复 14# Batcher


    已找到原因,不在for、dir命令中,for命令自带""双引号,路径中不加双引""也可以。

保存路径需要加双重”号。
问题在这里:echo %%~na>> "%folder%"\%date:~5,2%-%date:~8,2%.txt


正确的是:echo %%~na>> ""%folder%"\%date:~5,2%-%date:~8,2%.txt"
作者: bcetl    时间: 2022-3-30 14:26

回复 13# buyiyang


    你提供的方向是对的,谢谢
作者: buyiyang    时间: 2022-3-30 14:40

回复 18# bcetl


    你这个确实是我没想到的,你能把代码发出来吗?
作者: Batcher    时间: 2022-3-30 14:54

回复 17# bcetl


    以后别这样写了,容易出错。简简单单加一对引号就够了。
作者: bcetl    时间: 2022-3-30 15:11

回复 20# Batcher


    加一对没用,还是要加两对才有用。:lol
作者: bcetl    时间: 2022-3-30 15:23

回复 19# buyiyang

set /p folder=
for /f "delims=" %%a in ('dir /b/a-d/oN %folder%\*.mp4 %folder%\*.mp3') do (
echo %%~na>> ""%folder%"\%date:~5,2%-%date:~8,2%.txt"
if "%%~xa"==".mp3" (for /f "tokens=1-2 delims=-" %%i in ("%%~na") do (echo %%j>> ""%folder%"\去歌手纯歌名%date:~5,2%-%date:~8,2%.txt"))
)
作者: Batcher    时间: 2022-3-30 18:51

回复 21# bcetl


    14楼的那种代码写法在你电脑上测试的时候有什么报错信息吗能否发出来看看?
作者: bcetl    时间: 2022-3-30 22:30

回复 23# Batcher


   


    大神的脚本没有报错,主要是这一段保存路径问题:>> "%folder%\%date:~5,2%-%date:~8,2%.txt"


比如C:\11\2 2\A A\b b.txt,执行结果是C:\11\2 2\下生成一个名字叫“A”的无后缀名文件,即C:\11\2 2\A,用记事本打开,是bat的执行日志

现在我直接用你教过的脚本定位方法解决。
set date=%date:~5,2%-%date:~8,2%
set /p folder=
cd /d "%folder%"
后面是>>"%date%.txt"

或者,保存路径使用双重引号,也可以解决,是这个:>>" "%folder%"\%date%.txt" 也可以。
作者: Batcher    时间: 2022-3-31 00:09

回复 24# bcetl


    你是把一个文件夹拖放的bat脚本上面执行的?
作者: bcetl    时间: 2022-3-31 00:30

回复 25# Batcher


    是的。如果只是单个,就没必要搞脚本了。大量文件,搞脚本才轻松。
作者: Batcher    时间: 2022-3-31 10:49

回复 26# bcetl


提个小建议,尽量少拖放。
文件夹名称里面可能存在的特殊字符有可能让代码出错。
有条件的情况下尽可能通过别的方式执行BAT脚本。
作者: bcetl    时间: 2022-3-31 12:08

回复 27# Batcher


    好的,谢谢。。。遇到特殊符号的路径,我会先修正一下。因为要处理的文件比较多,分布文件夹也多。老是把脚本复制来复制去,也挺麻烦的。
作者: Batcher    时间: 2022-3-31 12:24

回复 28# bcetl


    如果有规律,可以试试在BAT脚本里面自动找到那些文件夹。
作者: qixiaobin0715    时间: 2022-3-31 12:32

回复 28# bcetl
也可用cd命令定位路径。
作者: bcetl    时间: 2022-3-31 12:40

本帖最后由 bcetl 于 2022-3-31 12:46 编辑

回复 29# Batcher

规律不是很明显。并无太大规律

回复 30# qixiaobin0715

嗯,是的。后续脚本已经用cd定位路径了。

2位大神帮我看看脚本哪里出错了。。。直接回车闪退了,暂时试了几种方法都没找到原因。
编码是ansi、utf8都试了。

setlocal enabledelayedexpansion
::固定路径
set folder=H:\1111(这行删除了,也是空值闪退)
:begin
set /p var=
if %var%==0 goto dell(请忽略)
if %var%==1 goto hhgg(请忽略)
if %var%==2 goto lrr(请忽略)
if %var%==. goto bye(请忽略)
if %var%==+ goto gg(执行有效,备选方案)

::无定义、无赋值、空值,直接回车,继续执行;
::if "%var%"== (echo 空值) else echo true
::if not defined var goto gg
if defined var (goto bye) else goto gg
::if "%var%==" (echo 空值) else echo true
::if "%var%"=="" (echo 空值) else echo true

:gg
@echo 测试执行
pause
pause

:bye
@echo 测试退出
pause



就是无法直接回车,空值跳转




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2