【问题标题】:Move a single file by extension with a batch file使用批处理文件按扩展名移动单个文件
【发布时间】:2017-06-15 08:51:05
【问题描述】:

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

所以我想制作一个通过扩展名移动文件的批处理文件(在我的情况下,它是 .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

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

Greetz 无情

【问题讨论】:

    标签: batch-file command move


    【解决方案1】:
    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 基本形式(仅文件名)@987654325 执行目录扫描@ 没有目录名。目录中存在的每个文件名将依次分配给%%adelims= 选项允许处理包含空格的文件名。

    找到第一个文件时,其名称为echoed 和序列号,标志为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 现在是 called,它解析了变量子字符串。由于%%x 从1 到%pdf% 不等,因此tspaces 的选择是%%x 字符 - 当需要olddocument 的最后一个字符时,它的最小值为1;其后有多个空格,因此ttspaces 的初始值。

    【讨论】:

    • 我会试试这个。感谢您的快速回复!
    • 好的,我试过了,首先我得到了找不到路径的消息,所以我在 move 命令后面的路径中添加了引号,然后我得到了一个语法错误,但没有其他信息在哪里可以找到此语法错误。有什么想法吗?
    • 第一步是找出哪个命令产生了消息。我会在 move 命令之前插入 REM 以使该命令成为注释。如果这样可以解决问题,则move 有问题,否则是dir。确保您输入的行与我显示的完全相同(最好是剪切和粘贴) - 批处理有时对语法非常敏感。最重要的是,要非常小心引号 - 单引号和双引号,并且不要使用文字处理器,因为 WP(以及像记事本这样的 WP-wannabes)会尝试“格式化”文本或更改为“智能引号”使用真正的编辑器,如editplus或Notepad++
    • 已解决,在一个 Y 驱动器后面缺少一个简单的“:”。现在只剩下一件事了,我想拥有。移动文件后,脚本还应重命名刚刚创建的文件夹中的文件。例如,我移动了 3 个 pdf 文件,现在脚本必须进入文件夹并将名称从“2017-06-15....whatever.pdf”更改为“OldDocument.pdf”,并且每当重命名另一个文件时,添加名称后面有一个空格,因此第二个 pdf 类似于“OldDocument .pdf”。这可能吗?
    • 这是有可能的——只要有足够的注意力,几乎任何事情都是可能的。然而,简单的方法是将move 语句更改为move "Y:\Scan\%%a" Y:\Scan\%FOLDERNAME%\OldDocument%%x.pdf",这将生成olddocument1.pdf``,olddocument2.pdf,olddocument3.pdf` 等等。另请注意,如果要覆盖现有文件,可能需要将/y 添加到move
    猜你喜欢
    • 2014-08-13
    • 2013-08-03
    • 2011-03-14
    • 2011-09-18
    • 1970-01-01
    • 2018-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多