我有一个文件Staffel artikelen met € bedragen.xlsx
,我想用新文件名StaffelArtikelen.xlsx
将其复制到另一个目录中。我认为欧元登录文件名会导致错误。
如何避免此错误:
无法在源位置上重命名源文件。
我尝试过:
set dest1=\\serverb02\DATA\Databeheer\StaffelArtikelen.xlsx
set source=\\serverb02\DATA\Uitwisseling
pushd "%source%"
for /f "tokens=*" %%G in ('dir Staffel artikelen met *.xlsx /b /a-d /od') do SET "newest=%%G"
copy "%newest%" "%dest1%"
结果是目标位置中的文件大小为1 kB(应为+20 kB)。我希望StaffelArtikelen.xlsx
。
源目录中的文件:
应使用StaffelArtikelen.xlsx
作为目标文件名复制最新修改的文件。
答案 0 :(得分:0)
在处理包含空格的文件名时,您必须用双引号引起来。
否则,dir
会将空格分隔的部分视为要列出的单个项目
由于可能没有不带扩展名Staffel
,artikelen
,met
的文件,只有*.xlsx
会返回最新的 ALL 显示excel文件和
由于您没有在批处理中显示源文件,因此将其复制到新名称而不会引起注意。
set dest1=\\serverb02\DATA\Databeheer\StaffelArtikelen.xlsx
set source=\\serverb02\DATA\Uitwisseling
pushd "%source%"
set "newest="
for /f "tokens=*" %%G in ('dir "Staffel artikelen met *.xlsx" /b /a-d /od') do SET "newest=%%G"
if defined newest (
copy "%newest%" "%dest1%"
) else (
Echo no file found matching "Staffel artikelen met *.xlsx"
)
答案 1 :(得分:0)
此批处理文件也可以用于此任务。
@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "dest1=\\serverb02\DATA\Databeheer\StaffelArtikelen.xlsx"
set "source=\\serverb02\DATA\Uitwisseling"
for /F "eol=| delims=" %%I in ('dir "%source%\*Staffel artikelen met*.xlsx" /A-D-H /B /O-D 2^>nul') do (
copy /Y /B "%source%\%%I" "%dest1%" >nul
goto CopyDone
)
:CopyDone
rem Other commands can be inserted here.
endlocal
文件/文件夹名称如果包含空格或以下字符之一"
,则必须用&()[]{}^=;!'+,`~
括起来,如在command prompt中运行时Windows命令处理器输出的帮助所解释的那样最后一个帮助页面上的cmd /?
窗口。命令variable=value
的{{1}}之类的其他参数字符串也应该用双引号引起来,以将引号中的所有字符字符串解释为文字字符。
set
的命令 FOR 和在/F
之间指定的命令行会导致在后台使用'
和指定的命令行启动另一个命令过程。因此,由 FOR 执行的是将Windows安装到%ComSpec% /c
:
C:\Windows
DIR 搜索
C:\Windows\System32\cmd.exe /c dir "\\serverb02\DATA\Uitwisseling\*Staffel artikelen met*.xlsx" /A-D-H /B /O-D 2>nul
\\serverb02\DATA\Uitwisseling
而用于非隐藏文件(属性不是目录,也不是隐藏的)/A-D-H
*Staffel artikelen met*.xlsx
而以裸格式输出,只是文件名而不包含文件路径/B
,按上次修改日期(默认)的顺序进行了反向排序(这意味着最新/最新修改的文件在前,而最早的文件在最后)。输出文件名以处理后台命令过程的 STDOUT (标准输出)。此输出分别由 FOR 和运行批处理文件的命令进程捕获。
可能没有目录条目符合指定的搜索条件,从而导致通过 DIR 打印错误消息来处理 STDERR (标准错误),该错误消息由重定向> FOR 到运行批处理文件的命令进程的 STDERR 。可以通过在后台运行的启动/O-D
将错误消息重定向到设备 NUL 来抑制此错误消息。
阅读有关Using Command Redirection Operators的Microsoft文章,以获取cmd.exe
的解释。当Windows命令解释器在执行命令之前处理此命令行时,重定向操作符2>nul
必须在 FOR 命令行上使用脱字符号>
进行转义,才能被解释为文字字符。 FOR ,它将在后台启动的单独命令进程中执行嵌入式^
命令行。
FOR (带有选项dir
)在启动/F
终止自身后,逐行处理捕获的命令行过程的标准输出,如下所示:
cmd.exe
。在这种情况下,不需要这种行拆分行为,因为文件名肯定包含空格,并且整个文件名都应分配给循环变量I
,而不仅仅是文件名直到第一个空格为止。因此,I
定义了一个空的定界符列表,以完全关闭行拆分。delims=
开头,该字符是文件名第一个字符的有效字符。因此,;
将行尾字符重新定义为竖线,根据Microsoft文章Naming Files, Paths, and Namespaces,该竖线不能包含任何文件名。 BTW:仅使用选项eol=|
会导致行拆分,但是即使在第一个非空格字符之后有空格,前导空格/制表符之后的所有内容也会分配给指定的循环变量。文件名以一个或多个空格开头是非常不寻常的,但是它是可能的。 tokens=*
会将没有前导空格的文件名分配给循环变量tokens=*
,并且进一步的处理失败,因为找不到文件名开头缺少空格的文件,或者在最坏的情况下处理了另一个文件,与要删除的前导空格后要处理的文件相同的文件名。
因此,在循环的第一次迭代中,将 DIR 找到的最新文件的文件名分配给循环变量I
,而没有路径。该文件将以二进制文件的形式复制到具有新文件名I
的目标目录,并在目标目录中覆盖一个已经存在且具有相同文件名的文件,而不会提示用户。
注意:如果
提供的批处理文件不包含文件复制成功或失败的检查。
GOTO 命令用于在复制最新文件后退出循环,以忽略 DIR 输出的所有其他文件名,并在带有标签的行下方继续批处理文件StaffelArtikelen.xlsx
。
要了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读每个命令显示的所有帮助页面。
CopyDone
copy /?
dir /?
echo /?
endlocal /?
for /?
goto /?
rem /?
set /?