如何使用批处理文件从文本文件中删除引号?

时间:2017-04-02 12:57:31

标签: windows batch-file

我正在尝试编辑使用.bat输入到文本文件中的引号。

echo %name%>./User_Records/%username%.txt

在文本文件中保存为

"Firstname Lastname"

我正在尝试添加到批处理文件中,以便编辑* .txt文件并删除引号(如果它们保存在该文本文件中)。

任何人都可以帮助我吗?

我一直试图这样做几个星期。我希望输出看起来像

Firstname Lastname

4 个答案:

答案 0 :(得分:1)

尝试使用"替换%name%变量中Environment variable substitution的所有实例(有关详情,请参阅set /?

@echo off
set "name=%name:"=%"
echo %name%>./User_Records/%username%.txt

如果您尝试在保存文本文件后替换引号,请参阅此previous question

答案 1 :(得分:0)

echo %name:"=%>.\User_Records\%username%.txt

应该在记录之前删除引号,如果这是你的问题。

请注意,窗口中的路径分隔符为\而不是/

但是 - 如果你的问题是关于已经存在的文件,那么最简单的方法就是使用你的编辑器。取决于你必须处理多少文件 - 你还没有指定。

答案 2 :(得分:0)

如果使用set name="..."语法将从文本文件中读取的名称分配给环境变量名称,则这是输出字符串中双引号的原因。

如果分配给环境变量的字符串用双引号括起来,或者命令 SET 的整个参数字符串,则会产生很大的不同。阅读Why is no string output with 'echo %var%' after using 'set var = text' on command line?上的答案,了解使用set "variable=string"set variable="string"之间的巨大差异。

但是当然可以通过使用字符串替换从当前分配给环境变量name的字符串中删除所有双引号:

set "name=%name:"=%"

"字符串中出现的所有name都被空字符串替换,结果字符串再次分配给环境变量name

但要注意这个命令行

echo %name%>"./User_Records/%username%.txt"

可能会导致不需要的行为,例如,如果分配给环境变量name的名称为C&A。扩展环境变量name之后和执行命令 ECHO 之前由Windows命令解释程序发现的&符号现在被解释为AND运算符,而不再是 ECHO输出的文字字符

一种解决方案是使用延迟扩展,例如:

@echo off
setlocal EnableExtensions DisableDelayedExpansion

rem Environment variable name is defined with delayed expansion disabled
rem making it possible to assign an exclamation mark as literal character
rem without the need to escape it as it would be necessary when delayed
rem expansion would be enabled already here at this time.

set "name=C&A!"

rem Enable delayed expansion which results in pushing on stack current
rem state of command extensions and of delayed expansion, the current
rem directory path and the pointer to current environment variables list
rem before creating a copy of all environment variables being used further.

setlocal EnableDelayedExpansion

rem Output the value of environment variable name using delayed expansion
rem with redirection into a text file being named like the currently used
rem user account name which of course can contain a space character or
rem other characters requiring enclosed file name with relative path in
rem double quotes.

echo !name!>".\User_Records\%username%.txt"

rem Delete all environment variables, restore pointer to previous set of
rem environment variables, restore current working directory from stack
rem restore states of command extension and delayed expansion from stack.
endlocal

rem Explicitly call ENDLOCAL once again for initial SETLOCAL command.
rem That would not be necessary because Windows command interpreter
rem runs implicitly ENDLOCAL for each local environment still being
rem pushed on stack.

endlocal

另一种解决方案是使用命令 FOR 进行隐式延迟扩展:

@echo off
set "name=C&A!"
set "name=%name:"=%"
for /F "delims=" %%I in ("%name%") do echo %%I>".\User_Records\%username%.txt"
set "name=

另请参阅Batch: Auto escape special characters上的答案。

要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。

  • echo /?
  • endlocal /?
  • for /?
  • set /?
  • setlocal /?

另请阅读Microsoft有关Using Command Redirection Operators

的文章

答案 3 :(得分:0)

你正在使用的bat文件应该被改变,特别是你从它提供的行有一些问题,(大多数已经提到过)

SetLocal EnableDelayedExpansion
(Echo=!name:"=!)>"User_Records\%username%.txt"
EndLocal

如果你无法控制那个bat文件,那么像这样的东西应该做你想要的:

@For /F "UseBackQ Delims=" %%A In ("User_Records\%username%.txt") Do @Echo(%%~A

可替换地:

@Set/P "FullName="<"User_Records\%username%.txt"
@Echo(%FullName:"=%