考虑这个脚本:
SETLOCAL EnableDelayedExpansion
for /F "tokens=2 delims=." %%G in ("%1") do set partial_name = %%G
if partial_name GEQ 9200 ( move I:\rosa\transfertmp\%1 L:\OSLDos\Tmp\ ) else ( move I:\rosa\transfertmp\%1 L:\LdisOSLDos\Tmp\ )
ENDLOCAL
调用为thisscript 11111.9100.csv
我想要做的是:根据文件名的第二段(9100)将文件移动到正确的文件夹,因此如果它大于 9200,则将其移动到一个文件夹,如果不大于,则移动到另一个文件夹。
问题似乎是比较不起作用。
答案1
Dennis 在他的回答中指出了一个问题并提供了解决方案。但还存在其他问题。
1) 您的代码set partial_name = %%G
将在变量名称中包含一个尾部空格,并在值中包含一个前导空格。代码应为set partial_name=%%G
2)您的%1
值可能已被引用,在这种情况下,您应该先删除引号,然后再使用"%~1"
而不是添加自己的值"%1"
。
3)在您的情况下可能不是问题,但如果名称包含空格或特殊字符,通常最好将文件路径括在引号中。
4) 我假设您想进行数字比较。当 IF 命令尝试解析数字时,它使用的规则与 SET /A 命令几乎相同 - 任何以 0 为前缀的数字都将被视为十六进制表示法。如果它发现无效的十六进制数字(如 8 或 9),则 IF 将恢复为字符串比较而不是数字比较。
例如if 09 lss 8 (echo true) else echo false
返回true
。
因此,如果文件名的第二段有可能以零开头,那么您需要做更多的工作。
set "partial_name="
for /f "tokens=2 delims=." %%G in ("%~1") do (
for /f "tokens=* delims=0" %%N in ("%%G") do set /a "partial_name=%%N"
if not defined partial_name set "partial_name=0"
)
if %partial_name% GEQ 9200 (
move "I:\rosa\transfertmp\%1" "L:\OSLDos\Tmp\"
) else (
move "I:\rosa\transfertmp\%1" "L:\LdisOSLDos\Tmp\"
)
答案2
您实际上是在将字符串partial_name
与进行比较9100
,而不是变量的内容。
由于p GEQ 9
,这将被评估为真。
另外,set partial_name = %%G
设置partial_name
为 %%G
(注意尾随和前导空格)。
要解决这两个问题,请用百分号 ( %
) 括住变量名,并删除符号 ( =
) 周围的空格:
for /F "tokens=2 delims=." %%G in ("%1") do set partial_name=%%G
if %partial_name% GEQ 9200 ( move I:\rosa\transfertmp\%1 L:\OSLDos\Tmp\ ) else ( move I:\rosa\transfertmp\%1 L:\LdisOSLDos\Tmp\ )