使用批处理文件

时间:2017-06-15 08:51:05

标签: batch-file command move

这是我在这个网站上的第一篇文章,但由于我已经在stackoverflow上找到了很多帮助,我现在自己提出这个问题。我没有找到这个问题的答案。我的英语不是那么好,因为我的问题很复杂,我希望你们都能理解我。如果没有,或者有任何问题需要帮助我,请随时提问。

所以我想创建一个Batch文件,通过Extension(在我的例子中,它是.pdf)移动文件,但不是全部。我知道有这个命令:

move "Y:\Scan\*.pdf" "Y:\Scan\Archive\"

但是这会将所有pdf文件移动到存档文件夹,我不想这样做。 为了更好地了解我的计划,我想我需要一个小的描述。 想象一下,你有一个家庭服务器和你的计算机连接到它,打印机和扫描仪也是如此。我在家庭办公室的文件夹中有很多文档,我希望将它们全部放在我的服务器上。这是通过扫描这些文件夹中的所有纸张来完成的。每当我扫描一些东西时,它都会以.pdf的形式保存在我本地计算机上的文件夹中,按时间排序,如下所示:2017-06-15-10-30.pdf

我当前的脚本要求用户输入3次。一次是村庄名称,一次是街道名称,一次是房子号码,因为档案馆的文件夹应该被命名为他们所指的相应房屋。所以我已经批量处理了这3个输入,并且整个文件夹名称也保存在一个新变量中。

我的计划是现在询问用户与最后创建的文件夹对应的pdf数量以及用户输入的内容,这些文件数量将存储在该文件夹中。为了更好地理解这一点,这是我到目前为止所完成的工作(我的批处理代码)。



@echo off
cls

title Archive-Script (by Relentless)
color 0b


:reset
cls

REM This is the village's name
SET ON=""
REM This is the street's name
SET SN=""
REM This is the number of the house
SET HN=""
REM This is a variable to store whether the user wants to reset the variables or not (used later)
SET RESET=""


:start
cls
IF %RESET% == N echo To overwrite the village's name, please enter the name again and hit enter. If you don't want to overwrite the name, just hit enter!
IF NOT %RESET% == N echo Please enter the village's name (confirm by pressing enter):
IF %RESET% == N echo Current name: %ON%
set /p "ON="
echo The village's name was set to %ON%!

echo.

IF %RESET% == N echo To overwrite the street's name, please enter the name again and hit enter. If you don't want to overwrite the name, just hit enter!
IF NOT %RESET% == N echo Please enter the street's name (confirm by pressing enter):
IF %RESET% == N echo Current name: %SN%
set /p "SN="
echo The street's name was set to %SN%!

echo.

IF %RESET% == N echo To overwrite the house's number, please enter the number again and hit enter. If you don't want to overwrite the number, just hit enter!
IF NOT %RESET% == N echo Please enter the house's number (confirm by pressing enter):
IF %RESET% == N echo Current number: %HN%
set /p "HN="
echo The house's number was set to %HN%!

echo.
echo.
echo.
echo.
echo.

SET FOLDERNAME="%ON%, %SN% %HN%"
echo The folder %FOLDERNAME% will now be created!
mkdir ""%FOLDERNAME%""
timeout /t 2 /nobreak


:pdfmove
cls
echo How many pdf-files are corresponding to the latest created folder?
set /p "PDF="
for /l %%x in (1,1,%PDF%) do (
	echo %%x
	move Y:\Scan\*.pdf Y:\Scan\%FOLDERNAME%\
)


:resetoption
cls
echo %ON%
echo %SN%
echo %HN%
echo.
echo Should the variables be resetted again? (J/N)
set /p "RESET="
IF %RESET% == J goto reset
IF %RESET% == N goto start




正如您所看到的,我已经尝试实现移动选项,但是这将移动所有pdf文件而不是每个用于循环的文件。任何人都可以帮助我吗?我想代码很容易理解。

Greetz Relentless

1 个答案:

答案 0 :(得分:0)

for /l %%x in (1,1,%PDF%) do (
 set "moved="
 for /f "delims=" %%a in ('dir /b /a-d "y:\scan\*.pdf" '
  ) do if not defined moved (
    echo %%x : %%a
    set "moved=Y"
    move "Y:\Scan\%%a" Y:\Scan\%FOLDERNAME%\
    )
)

我相信你要做的是移动用户输入的pdf数。

对于每个%%x,上述更改将首先将标记moved设置为 nothing ,然后以/b基本形式执行目录扫描(仅限文件名)/a-d,没有目录名。目录中的每个文件名将依次分配给%%adelims=选项允许处理包含空格的文件名。

找到第一个文件时,其名称为echo,带有序列号,标志为setY(任何非空字符串都可以)。然后移动该文件。

for...%%a...处理下一个文件名时,moved现在设置为一个值,因此不再执行文件移动。

然后对%%x的每个值重复整个过程,因此将移动源目录中找到的第一个%PDF%文件名的.pdf次移动,因为每次移动一个dir命令找不到上次移动的文件,因为它已被移动,因此不再在源目录中。

好的,这是修复产生可变数量的空格

SET "tspaces=T"
:addspace
SET "tspaces=%tspaces% "
CALL SET "testspace=%%tspaces:~%pdf%%%"
IF "%testspace%" neq " " GOTO addspace

FOR /L %%x IN (1,1,%pdf%) DO (
 set "moved="
 for /f "delims=" %%a in ('dir /b /a-d "y:\scan\*.pdf" '
  ) do if not defined moved (
    echo %%x : %%a
    set "moved=Y"
    call move "Y:\Scan\%%a" "Y:\Scan\%FOLDERNAME%\olddocumen%%tspaces:~0,%%x%%.pdf"
    )
)

第一部分设置tspacest +足够数量的空格。

请注意,在第二部分中,move现在是call ed,它解析了变量子字符串。由于%%x从1变为%pdf%,因此tspaces的选择为%%x个字符 - 当olddocument的最终字符为t时,它至少为1需要;之后会有一些空格,因此tspacespublic class ProgramItem { .... int getAsMins() { return hours *60 + mins; } } .... Collections.sort(items, new Comparator<ProgramItem>() { public int compare(ProgramItem item1, ProgramItem item2) { return item1.getAsMins() - item2.getAsMins(); } }); 的初始值。