此批处理文件旨在根据列17(发布者)中的值更新csv文件的列8(部门)。批处理文件运行-不会产生错误消息-但输出文件与输入文件完全相同-第8列未更新。我已经审查了我以前的问题的答案,搜索了许多教程,还研究了其他stackoverflow问题。这是我的问题:(1)if语句检查第17列的值的正确语法是什么;(2)在循环(对于/ f)命令中为第8列设置变量的正确语法是什么?
@echo off
setlocal EnableDelayedExpansion
rem | Move Manga to Manga Department
for /f "tokens=1-17,* delims=," %%A in (file.csv) do (
set "department=%%H"
set "publisher=%%Q"
if "!department!"=="3" (
if "!publisher!"=="YEN PRESS" (
set "%%H=1010"
)
)
>>file_14.csv echo %%A,%%B,%%C,%%D,%%E,%%F,%%G,%%H,%%I,%%J,%%K,%%L,%%M,%%N,%%O,%%P,%%Q,%%R
)
@echo on
1,"MAY090178","D ","BATMAN HUSH COMPLETE TP (C: 1-1-0)",24.99,11.2455,11.25,3,7, ,62464962,"76194127923700111","1401223176","978140122317552499"," ",0,"DC COMICS",000000
1,"NOV141747","F ","BLACK BUTLER GN VOL 19 (C: 1-1-0)",13.00,7.5400,7.54,3,7, ,62464962,"","0316259403","978031625940851300"," ",0,"YEN PRESS",127143
2,"MAY151682","F ","BLACK BUTLER GN VOL 20 (C: 1-1-0)",13.00,7.5400,15.08,3,7, ,62464962,"","0316305014","978031630501351300"," ",0,"YEN PRESS",127143
答案 0 :(得分:1)
set命令需要varname = value。您正在使用从文件读取的%% H的内容,并尝试通过该名称设置局部变量。试试:
set department=1010
然后:
>>file_14.csv echo %%A,%%B,%%C,%%D,%%E,%%F,%%G,!department!,%%I,%%J,%%K,%%L,%%M,%%N,%%O,%%P,%%Q,%%R
我确实认为我在那里发现了一个错误的错误。验证结果是否正确。如果将更多字段添加到csv文件中,您的tokens=1-17,*
稍后可能会咬您。 “ tokens = 1-18,*”对我来说更有意义。如果第18栏没有其他内容,我认为这对您来说并不重要,因此您最好还是对脚本进行过时验证。
除上述内容外,我将摆脱@echo off
和echo on
行,或者将@setlocal ...
语句放在脚本顶部。您不应该这样嘲笑用户环境。参见help setlocal
。您始终可以在每个脚本命令的前面放置@
符号,以避免显示该特定命令。脚本开头的@echo off
存在的问题是它很粘。如果脚本在某处失败,则回显标志的状态为最后设置的状态。这使得其中包含此类命令的脚本无法使用。
当每个命令前面带有@
符号时,调试脚本会更容易:
@setlocal EnableDelayedExpansion
@rem | Move Manga to Manga Department
@for /f "tokens=1-17,* delims=," %%A in (file.csv) do (
@set "department=%%H"
@set "publisher=%%Q"
@if "!department!"=="3" (
@if "!publisher!"=="XYZ" (
@set "department=1010"
)
)
>>file_14.csv @echo %%A,%%B,%%C,%%D,%%E,%%F,%%G,!department!,%%I,%%J,%%K,%%L,%%M,%%N,%%O,%%P,%%Q,%%R
)
通过这种方式,在调试时,您可以删除相关的@
或两个,而不必通读整个spew。如果该脚本最终被另一个脚本调用,那么如果由于脚本失败而错过了echo
off/on
,您将不会得到难以理解的喷出结果。