我对这些东西还很陌生,所以希望得到别人的帮助。
我在 Windows Vista 32 位版本上执行此操作。
我的桌面上有 2 个文件夹:folder_a(包含 sed.exe)和 folder_b,其中包含以下文件:
- 沙.txt
- 树.txt
- 椅子.txt
- xyz-fork.txt
- xyz-勺子.txt
如果我使用以下字符串运行批处理文件:
call "C:\Users\X\Desktop\folder_a\sed.exe" -i "1c table-zeta" "C:\Users\X\Desktop\folder_b\*xyz*.txt
我可以更改文件名包含 xyz 的文件的第一行。
现在我想要做的是更改文件名不包含 xyz 的文件的第一行;在本例中只有 sand.txt、tree.txt 和 chair.txt。
我该如何做呢?
答案1
这可能有点不雅,但请将其放入批处理文件中:
设置本地启用延迟扩展 ︙ 对于 %%f 在 (*) 中执行 ( 设置临时名称=%%f 设置 tempname=!tempname:xyz=! 如果 %%f == !tempname!(在此处输入您的 sed 命令)%%F )
该setlocal
命令可以位于批处理文件的开头,也可以位于循环之前for
,或者两者之间的任何位置。(我建议将其放在批处理文件的开头,紧跟在@echo off
. 之后)。运行cmd /?
并setlocal /?
获取有关此命令的更多信息。基本上,它可以让您以某种合理的方式处理循环中的变量。
我假设你对批处理文件有足够的了解,你明白 循环遍历文件名FOR variable IN (set) DO command
set
(可以包括通配符,例如*
),设置variable
到每个文件名,并执行command
。括号(在 之后do
和末尾)让我们得到多行command
。常规变量语法对 s 不起作用,因此我们将其复制到临时变量。然后我们使用变量扩展的(查找和替换)形式将s 中 的所有出现替换为 null。%%variable
%%f
%variable:str1=str2%
xyz
%tempname%
…除了,因为我们处于循环中,所以我们必须使用!
而不是%
(这就是 的用武之地setlocal enabledelayedexpansion
)。然后我们将缩写文件名与原始名称(仍在 中%%f
)进行比较。如果它们相等,则文件名中一定不存在xyz
,因此我们运行您的命令。如果它们不同,则意味着替换至少找到一个xyz
,因此我们不运行你的命令。
PS,我相信您不需要该call
命令。