首页 > 解决方案 > 批次不显示空值

问题描述

我目前正在开发一个批处理脚本,该脚本将基于主文件将文件从源移动到目标。我想添加一个条件,如果列中缺少值,那么它将跳过该行。我尝试了所有找到的解决方案,但它不会触发 if 条件。这是代码片段:

for /f "usebackq tokens=1-3 skip=1 delims=," %%a in (%MasterFilePath%) do (
set dest=%%c
set src=%%b 
if !dest!=="" do (echo destination for source !src! is empty)

这是主文件的示例:

FolderName,SrcPath,DestPath
FolderA,C:\Work\FolderA,
FolderB,C:\Work\FolderB,C:\Work\Sample\Dest2
FolderC,C:\Work\FolderC,C:\Work\Sample\Dest3

标签: windowsbatch-filecmd

解决方案


FOR /F命令将始终将连续的分隔符视为一个分隔符。因此,如果您分隔的文件有一个空字段并且没有引号,则这些字段将移到您的左侧。因此,要解决此问题,您可以使用两个FOR /F命令。第一个将阅读整行。然后强制该变量使用字符串替换在每个字段周围加上引号。然后,您可以使用第二个FOR /f命令将字段拆分为您需要的字段数量。

@ECHO OFF
set "MasterFilePath=file.txt"
FOR /F "usebackq skip=1 delims=" %%G IN ("file.txt") DO (
    set "line=%%G"
    setlocal enabledelayedexpansion
    SET "line="!line:,=","!""
    for /f "tokens=1-3 delims=," %%A IN ('echo !line!') do (
        IF NOT "%%~B"=="" IF NOT "%%~C"=="" ECHO ROBOCOPY "%%~B" "%%~C"
    )
    endlocal
)

为简洁起见,我只是检查源和目标是否都不为空,然后将 robcopy 命令回显到屏幕上。

通过您的输入示例,您会看到这一点。

ROBOCOPY "C:\Work\FolderB" "C:\Work\Sample\Dest2"
ROBOCOPY "C:\Work\FolderC" "C:\Work\Sample\Dest3"

推荐阅读