比较Windows批处理文件中文件名的一部分

比较Windows批处理文件中文件名的一部分

考虑这个脚本:

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\ )

相关内容