Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 循环,拆分字符串,包含'&';_Batch File - Fatal编程技术网

Batch file 循环,拆分字符串,包含'&';

Batch file 循环,拆分字符串,包含'&';,batch-file,Batch File,我在另一个帖子里问了一个非常糟糕的问题,我得到的答案不起作用,因为我问得太糟糕了。这一次我会努力把它做好 我想查看目录中符合特定掩码(*.txt)的所有文件,并将每个文件的名称拆分为两个字符串 每个文件名的格式如下: string1由string2.txt生成 它们实际上是文档,文件名是文档标题和作者 string1和string2都可以包含空格;字符串1和字符串2都可以包含与符号(“&”) 到目前为止,我得到的是: @echo off echo. setlocal EnableDelayedE

我在另一个帖子里问了一个非常糟糕的问题,我得到的答案不起作用,因为我问得太糟糕了。这一次我会努力把它做好

我想查看目录中符合特定掩码(*.txt)的所有文件,并将每个文件的名称拆分为两个字符串

每个文件名的格式如下:

string1由string2.txt生成

它们实际上是文档,文件名是文档标题和作者

string1和string2都可以包含空格;字符串1和字符串2都可以包含与符号(“&”)

到目前为止,我得到的是:

@echo off
echo.
setlocal EnableDelayedExpansion
for %%f in (*.mobi) do (
call:split "%%f"
)
goto :EOF

:split
set "filename=%~1"
set "author=%filename:* by =%"
set "title=!filename: by %author%=!"
set "author=%author:.txt=%"
echo Filename: -%filename%-
echo Title: -%title%-
echo Author: -%author%-
echo.
除了在两个字符串中都有一个“和”之外,其他的都可以。然后一切都变成了梨形


如果我可以去掉子例程并在for循环中完成所有操作,那也很好。

如果不将
&
放在双引号中,您就无法回显它。如果您可以使用
“Asimov&Heinlein”
而不是
Asimov&Heinlein
的输出:

@echo off
setlocal enabledelayedexpansion
for %%i in (*.mobi) do (call :doit "%%i")
exit /b

:doit
set string=%1
set string=%string:&=§%
set string=%string: by =.%
for /F "tokens=1,2 delims=." %%a in ("%string%") do (
 set str1=%%a
 set str2=%%b
 set str1="!str1:§=&!"
 set str2="!str2:§=&!"
 echo( --!str1!--!str2!--
)
goto :eof
如果选择将其替换为
+

@echo off
set string=
for %%i in (*.mobi) do ( call :doit "%%i" )
exit /b

:doit
set string=%1
set string=%string:&=+%
set string=%string: by =.%
for /F "tokens=1,2 delims=." %%a in (%string%) do (
   echo --%%a--%%b--
)

您可以使用延迟扩展
!瓦尔
而不是
%var%
,所有内容都将被保留,甚至包括
&
等有毒字符。这也将允许您删除子例程。但有一个更简单的方法

使用
~n
修饰符只获取基本名称,不带扩展名

替换为“
”:“,这是一个不能出现在文件名中的字符。然后可以使用FOR/F循环轻松解析标题和作者。不需要为Title和Author分配变量,只需直接使用for变量。与延迟扩展一样,FOR变量也可以保护有毒字符

@echo off
setlocal enableDelayedExpansion
for %%F in (*.mobi) do (
  set "file=%%~nF"
  for /f "tokens=1,2 delims=:" %%A in ("!file: by =:!") do (
    echo Filename: -%%F-
    echo Title: -%%A-
    echo Author: -%%B-
    echo(
  )
)
还是应该如此

for %%F in (*.txt) do ...
如果标题可能包含
字符,则当扩展
%%A
时,它将被损坏,因为延迟扩展已启用。解决方案是在循环中打开和关闭延迟扩展

@echo off
setlocal disableDelayedExpansion
for %%F in (*.mobi) do (
  set "file=%%~nF"
  setlocal enableDelayedExpansion
  for /f "tokens=1,2 delims=:" %%A in ("!file: by =:!") do (
    endlocal
    echo Filename: -%%F-
    echo Title: -%%A-
    echo Author: -%%B-
    echo(
  )
)
你仍然有一个潜在的问题,我担心这将是非常难以克服的-如果一个标题包含“by”这个词怎么办?我脑海中浮现出一个电影名字,“西北偏北”。但我必须相信也有书名。如果有一位作者使用了带有“by”一词的笔名,我不会感到震惊

以下修改将正确处理标题中出现一个“by”的情况。它可以扩展到支持标题中的二、三等。使用递归,它可以支持N次出现。但是如果“by”可以出现在作者的文章中,那么我现在不知道你如何解决它

@echo off
setlocal disableDelayedExpansion
for %%F in (*.mobi) do (
  set "file=%%~nF"
  setlocal enableDelayedExpansion
  for /f "tokens=1,2* delims=:" %%A in ("!file: by =:!") do (
    endlocal
    echo Filename: -%%F-
    if "%%C" equ "" (
      echo Title: -%%A-
      echo Author: -%%B-
    ) else (
      echo Title: -%%A by %%B-
      echo Author: -%%C-
    )
    echo(
  )
)

如果不将
回送
一个
放在双引号中,则无法回送它。你能接受“阿西莫夫和海因莱因”而不是“阿西莫夫和海因莱因”的输出吗?或者用“+”替换它是一种选择?你的文章说文件是*.txt,但你的代码寻找*.mobi。是哪一个?我不确定我是否理解你所说的-你说“如果你能接受”Asimov&Heinlein“的输出…看起来你给出的两个选项是相同的,都包括“&”。无论如何,当我运行你给出的第一个解决方案时,它失败了,因为角色的┬º'。这两种解决方案只作用于目录中的最后一个文件。@user1773179-区别在于一种形式有引号,另一种没有。但是如果使用延迟扩展,则不需要引号。@dbenham:您介意,告诉我怎么做吗?不知何故,我找不到没有引号的方法(第一个选项)@user1773179:对不起,我的错。编辑以处理所有匹配的文件。好的,但在我看来,如果不使用双引号,就不可能将其放入变量并使用它们。我说得对吗,或者有什么诀窍吗?(
set
有效,但是
echo
它们对我来说似乎是个大问题,因为解析器会捕捉到它)@Stephan否,您始终可以对任何内容使用延迟扩展。
echo!works!
而不是
echo%works%
,因为延迟扩展是批处理的最后阶段parser@jeb:你是对的,它可以工作。嗯-如果发现我的失败:我尝试了
%
o像往常一样使用块“这使我的答案过时了。谢谢你,杰布和德本哈姆答案很好,德本哈姆-非常感谢。正如您所怀疑的,剩下的一个问题是,标题中可能有“by”一词。区分大小写有帮助吗?我可以使标题和作者中的所有单词都大写;因此,如果标题或作者中有一个“by”,它实际上将是“by”,而不是“by”。@user1773179-更改大小写没有帮助,因为批搜索和替换不区分大小写。请参阅我的更新答案,了解支持在标题中出现一次“by”的变体。