BATCH,使用VARIABLE NAME

时间:2018-05-18 04:33:59

标签: batch-file

我正在尝试制作一个批处理文件,它将:

  1. 要求提供目录(包含许多文件)

  2. 请求第二个目录(这是批处理为每个文件创建目录的位置,然后将每个文件复制到自己的目录中)

  3. 要从创建的目录的右侧删除的字符数。 (例如,两个文档'NewDoc_Ver1'和'NewDoc_Ver2'都将被复制到同一目录'NewDoc'中。)

  4. 以下是一些可能有用的类似问题。

    https://superuser.com/questions/1138283/batch-script-for-moving-files-to-the-same-name-folder

    How do you get the string length in a batch file?

    batch files calling %~1 and getting the variable's current value/string

    https://ss64.com/nt/syntax-substring.html

    我目前仍然试图让'String Left'与动态数字一起使用。 (我还没看过如何输入用户输入) 任何帮助都会很棒。

    @echo off
    setlocal enabledelayedexpansion
    set folderpath=C:\Users\james.shaw\Desktop\R2
    for %%f in (%folderpath%\*.*) do (
      set "foldername=%%~nf"
      set f1=!foldername!
      call :strlen folderlength foldername
    REM set JS1=%%foldername:~0,!folderlength!%%
    set JS1=!f1!:~0,!folderlength!
      md !JS1!
    REM md "!foldername:~0,!folderlength!!" >nul 2>&1
      move "%%f" "!foldername:~0,!folderlength!!"
    pause
    )
    goto :eof
    
    :strlen <resultVar> <stringVar>
    (   
        setlocal EnableDelayedExpansion
        set "s=!%~2!#"
        set "len=0"
        for %%P in (4096 2048 1024 512 256 128 64 32 16 8 4 2 1) do (
            if "!s:~%%P,1!" NEQ "" ( 
                set /a "len+=%%P"
                set "s=!s:~%%P!"
            )
        )
    )
    ( 
        endlocal
        set "%~1=%len%"
        exit /b
    )
    

    更新

    下面是我发现的一个类似于我正在寻找的(我丢失了Web URL),但是这只在批处理文件所在的目录中运行,并且不允许截断创建目录: 我仍然有兴趣了解我在最初的尝试中做错了什么。

    @echo off
    setlocal EnableDelayedExpansion
    
    set RemoveStrings="[ www.AnnoyingSpam.com ]",
    Rem     RemoveStrings     variable notes:
    Rem     Surround strings to remove with double quotes.
    Rem     Separate each separate string to remove with a comma.
    
    goto :main
    
    : trim_leading_spaces VariableName
    setlocal EnableDelayedExpansion
        set "_=!%~1!"
        set _=%_:"=%
    : trim_leading_spaces__while
        if "%_:~0,1%"==" " ( set "_=%_:~1%"& goto :trim_leading_spaces__while)
    endlocal & set "%~1=%_%"
    goto :eof
    
    : trim_trailing_spaces VariableName
    setlocal EnableDelayedExpansion
        set "_=!%~1!"
        set _=%_:"=%
    : trim_trailing_spaces__while
        if "%_:~-1%"==" " ( set "_=%_:~0,-1%"& goto :trim_trailing_spaces__while)
    endlocal & set "%~1=%_%"
    goto :eof
    
    : main
    for /f "delims=" %%I in (     dir /b /a:-d ^| findstr /vixc:"%~nx0"     ) do (
        Set file = "%%~I"
        for %%J in (%REMOVESTRINGS%) do set "file=!FILE:%%~J=!"
        call :trim_leading_spaces  file
        call :trim_trailing_spaces file
        for %%J in ("!FILE!") do set "NewDirName=%%~nJ"
        md "!NEWDIRNAME!"
        ren "%%~I" "!FILE!"
        move "!FILE!" "!NEWDIRNAME!"
    )
    

2 个答案:

答案 0 :(得分:1)

根据你的例子判断:

NewDoc_Ver1
NewDoc_Ver2

您似乎可能有一个共同的分隔符,即_

如果情况确实如此,并且您只想在_作为文件夹名称之前使用第一个单词,那么这可能会有所帮助。

@echo off
setlocal enabledelayedexpansion
cls
:input
set /p "input=1. Enter Source directory: "
if not exist "%input%" echo Invalid source: "%input%" enter valid path && goto :input 
:output
set /p "output=2. Select Destination Directory: "
if not exist "%output%" echo Invalid Dest: "%output%" enter valid path && goto :output

for %%i in (%input%\*) do (
 set "file=%%~nxi"
 for /f "delims=_" %%a in ("!file!") do (
 set "folder=%%a"
 if not exist "!output!\!folder!" mkdir "!output!\!folder!"
  copy /Y "!input!\!file!" "!output!\!folder!" >nul
  echo Copied "!input!\!file!" to "!output!\!folder!\!file!"
  )
)

<强>解释

这会提示用户输入source目录。如果目录不存在,它将重新提示它,如果它存在,它将提示destination目录,如果目标路径无效,则回显它并重新提示它。

接下来,我们将每个文件分配给变量名称%file%,或者更确切地说是enabledelayedexpansion案例!file!,然后对于每个文件名,我们将其分割为{{1}并将名称的第一部分分配给_。 现在我们只检查文件夹是否存在于先前用户指定的目标中,如果不存在,则创建它,然后将!folder!中的每个文件复制到创建新文件夹的匹配目标目录中。

如果您的文件布局不符合您的示例,请提供适当的示例,我将修改我的答案。

答案 1 :(得分:1)

以下是您可以使用的示例脚本:

func numberOfSections(in tableView: UITableView) -> Int {
    return 1;
}

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let headerView = Bundle.main.loadNibNamed("StoresListHeaderView", owner: self, options: nil)?.first as! StoresListHeaderView;

    return headerView;

}
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return 170; 
}

只要输入数据正确,这应该可以正常工作。

我希望您实施这些检查并验证输入数据,(您的最终用户可以输入他们想要的任何内容)