Windows 将唯一文件批复制到新文件夹

Windows 将唯一文件批复制到新文件夹,windows,batch-file,Windows,Batch File,链接问题可能有助于我的提问: 我只是不理解替换规则,但我认为这是一个有着相似答案的问题 我正在使用下面的批处理序列尝试相同类型的移动操作。有人能帮我纠正语法吗 @echo off set source=C:\Users\my name\some long path with spaces set target=C:\Users\my name\a different long path with spaces for %%F in ("%source%") do if not exist "

链接问题可能有助于我的提问:

我只是不理解替换规则,但我认为这是一个有着相似答案的问题

我正在使用下面的批处理序列尝试相同类型的移动操作。有人能帮我纠正语法吗

@echo off

set source=C:\Users\my name\some long path with spaces
set target=C:\Users\my name\a different long path with spaces

for %%F in ("%source%") do if not exist "%target%\%~nF.jpg" copy "%%F" "%target%\%~nF.jpg"
其思想是将所有不带扩展名的文件复制到具有正确扩展名的目标中,其中目标文件具有匹配的文件名和特定扩展名。任何人都可以提供帮助,请提前感谢


编辑: 丹尼尔,谢谢你的参考资料,但我不想用匹配的扩展名将文件名复制到目的地。我正在尝试将文件名复制到具有新扩展名的同一文件名

例如:

source\filename001
destination\filename001.jpg
 - do nothing
source\filename002
destination\{no match}
 - copy source\filename002 to destination\filename002.jpg
亚历克斯,我不知道接下来该怎么办。我在没有echo关闭的情况下运行时查看了输出,这就是为什么我要发布这个问题。我不明白如何修改替换以正确工作


批处理的输出错误:

for %%~F in ("%source%") do if not exist "%target%\%~nF.jpg" copy "%%F" "%target%\%~nF.jpg"
批处理参数中path运算符的以下用法 替换无效:%~nF.jpg“复制”%%F“%target%\%~nF.jpg”


批处理参数中path运算符的以下用法 替换无效:%~nF.jpg“复制”%~F“%target%\%~nF.jpg”


解决方案:感谢您的帮助/解决方案/指导

set "source=C:\Users\my name\some long path with spaces"
set "target=C:\Users\my name\a different long path with spaces"

for /F "delims=" %%F in (
  'Dir /B "%source%\*." '
) do if not exist "%target%\%%~nF.jpg" copy "%source%\%%~F" "%target%\%%~nF.jpg"

您的问题是,在批处理文件中,可替换参数(保存对正在迭代的元素的引用的变量)的
前面需要有两个百分号(
%%F
),包括使用任何修饰符的情况(例如,文件名=
%%nF

在命令行中,可替换参数仅使用一个
%
,并且您的代码包括一些为批处理文件编写的引用和一些为命令行编写的引用

对于“%source%”中的%%F执行
^^^对于批处理文件中的可替换参数,加倍%
如果不存在“%target%\%~nF.jpg”,请复制“%target%\%~nF.jpg”
^^^^                           ^^^^
对于缺少百分比的可替换参数(在命令行中使用)
所以,要解决这个问题

@echo关闭
设置“source=C:\Users\my name\some long path with spaces”
设置“target=C:\Users\my name\一个带空格的不同长路径”
对于(“%source%\*.”)中的%%F,如果不存在,请执行“%target%\%%~nF.jpg”复制“%%~F”“%target%\%%~nF.jpg”

MC-ND速度快了一点,但您必须只选择源代码中没有扩展名的文件,因此我建议:

@echo off

set source=C:\Users\my name\some long path with spaces
set target=C:\Users\my name\a different long path with spaces

for /F "delims=" %%F in (
  'Dir /B "%source%\*." '
) do if not exist "%target%\%%~nF.jpg" copy "%%F" "%target%\%%~nF.jpg"

如果不重复,则可能重复,因为参考了类似查询的组成部分:
“%%~F”
<代码>“%%F”
将是
”C:\Users\my name\一些带空格的长路径“
。只需删除或
注释掉
@echo off
即可查看
cmd.exe
的功能。添加了我的查询的进一步解释…感谢您的帮助/解决方案。这两个都不是100%正确,但这一个最接近我的意图。我应用于您的解决方案的唯一更改是删除“%%F”中的引号。完美执行。@c.diaz,我的错。我错过了引语。为了防止将来可能出现的问题,我将使用
“%%~F”
(即,未引用文件引用的显式引用版本)我为发言过早表示歉意。结果文件复制操作是使用源的文件夹名而不是源的文件名将源文件复制到目标。当我看到所有正确的文件名经过时,我说得太快了,但是在验证结果时发现了问题。仍在努力解决这个问题。从MC ND尝试解决方案。我们有了它。答案的组合起了作用。不确定要标记哪个,但将更新问题以包含最终解决方案。考虑到最终解决方案的最大相似性,可能采用MC ND。
@echo off

set source=C:\Users\my name\some long path with spaces
set target=C:\Users\my name\a different long path with spaces

for /F "delims=" %%F in (
  'Dir /B "%source%\*." '
) do if not exist "%target%\%%~nF.jpg" copy "%%F" "%target%\%%~nF.jpg"