批处理脚本从字符串/文件名中删除动态文本后的所有内容

时间:2017-08-13 21:15:26

标签: windows batch-file rename windows-7-x64 batch-rename

我有一个包含文件名的字符串,如下面的批处理脚本行:

EXCEPTION
  WHEN ExcNull THEN
    dbms_output.put_line(SQLERRM);
    IF(INSTR(SQLERRM, 'EveNomNotNull') <> 0) THEN 
      DBMS_OUTPUT.PUT_LINE('Le nom ne peut pas être null.');
    ELSIF (INSTR(SQLERRM, 'EvePrenomNotNull') <> 0) THEN
      DBMS_OUTPUT.PUT_LINE('Le prenom ne peut pas être null.');
    ELSIF (INSTR(SQLERRM, 'EveNaissanceNotNull') <> 0) THEN 
      DBMS_OUTPUT.PUT_LINE('L''annee ne peut pas être null.');
    ELSIF (INSTR(SQLERRM, 'EveSexeNotNull') <> 0) THEN 
      DBMS_OUTPUT.PUT_LINE('Le sexe ne peut pas être null.');
    END IF;
    RAISE;
  WHEN ExcPK THEN 
    dbms_output.put_line(SQLERRM);
    IF(INSTR(SQLERRM, 'EveCpNageurs') <> 0) THEN 
      DBMS_OUTPUT.PUT_LINE('Le nageur existe deja.');
    ELSIF (INSTR(SQLERRM, 'EveUnicite') <> 0) THEN 
      DBMS_OUTPUT.PUT_LINE('Le prénom et le nom doivent etre uniques.');
    END IF;
    RAISE;
  WHEN ExcFK THEN
    dbms_output.put_line(SQLERRM);
    IF(INSTR(SQLERRM, 'EveRefNageursCat') <> 0) THEN 
      DBMS_OUTPUT.PUT_LINE('La categorie n''existe pas');
    ELSIF (INSTR(SQLERRM, 'EveRefNageursClubs') <> 0) THEN 
      DBMS_OUTPUT.PUT_LINE('Le club n''existe pas');
    ELSIF (INSTR(SQLERRM, 'EveRefNageursCP') <> 0) THEN 
      DBMS_OUTPUT.PUT_LINE('Le code postal n''existe pas.');
    END IF;
    RAISE;
  WHEN ExcCheck THEN
    dbms_output.put_line(SQLERRM);
    IF(INSTR(SQLERRM, 'EveSexe') <> 0) THEN 
      DBMS_OUTPUT.PUT_LINE('Le sexe doit être F ou M');
    ELSIF (INSTR(SQLERRM, 'EveCotisation') <> 0) THEN 
      DBMS_OUTPUT.PUT_LINE('La cotisation doit être O ou N');
    END IF;
    RAISE;
  WHEN TOO_MANY_ROWS THEN 
    DBMS_OUTPUT.PUT_LINE('Exception : Trop de données.');
    RAISE;
  WHEN NO_DATA_FOUND THEN 
    DBMS_OUTPUT.PUT_LINE('Pas de données.');
    RAISE;
  WHEN OTHERS THEN 
    RAISE;
END;

现在如上所述,文件名列表及其扩展名是多种多样的,我需要分别使用实际扩展名(set "file1=name.php_2017_23_08_12_22_07" set "file2=name.vbs_2016_16_12_12_13_03" .... .php)来获取真正的文件名。因此,当我传入带扩展名的文件的函数时,我应该得到如下的实际文件名:

.vbs

应该为我提供输出,删除变量call :restoreFile %file2% ".vbs"中的.vbs之后的所有内容:

%file2%

等其他变量也是如此。

如何设置这样的功能,从文件名字符串中删除动态子字符串

我尝试了以下代码,但这不适用于动态子字符串或文本,可以从变量中替换:

name.vbs

1 个答案:

答案 0 :(得分:0)

无需指定扩展名 - 它仍在名称中。

使用for /f分割第一个下划线。

:restoreFile
Set "FileName="
For /f "tokens=1* delims=_" %%N in ("%~1") Do Set "FileName=%%N"
If defined FileName Echo Ren %1 %FileName%
Goto :Eof

您甚至可以将date_time放在扩展名前面,以避免可能的欺骗:

:restoreFile
Set "FileName="
For /f "tokens=1* delims=_" %%N in ("%~1") Do Set "FileName=%%~nN_%%M%%~xN"
If defined FileName Echo Ren %1 %FileName%
Goto :Eof

如果输出看起来没问题,那么ren命令前面带有一个echo。