复制文件夹中的文件,然后用其他文件替换它
Copy a file in a folder, then replace it with other file
这是我的批处理文件:
@echo off
copy /Y "C:\Users\Murray\Desktop\My_File_Name_1.ssl" "C:\Program Files (x86)\Program\config\*.ssl"
目标文件夹中有另一个扩展名为 ssl 的文件,但其名称始终不同。因此,我想复制我的文件,然后覆盖目标文件夹中的当前文件。但是,我不想在目标中指定文件名,因为它总是不同,但总是具有相同的扩展名(如示例中的 ssl)。此批处理文件将文件复制到目标文件夹,但保留其他带有 ssl 扩展名的文件。我错过了什么?
在 运行 之后输出:
C:\Users\Murray\Documents>mytest.bat
C:\Users\Murray\Documents>SetLocal EnableExtensions
C:\Users\Murray\Documents>Set "SourceFile=C:\Users\Murray\Desktop\My_Test_File.ssl"
C:\Users\Murray\Documents>Set "Destination=C:\Program Files (x86)\Program\config"
C:\Users\Murray\Documents>For %G In ("C:\Users\Murray\Desktop\My_Test_File.ssl") Do If "%~aG" LSS "-" (GoTo :EOF ) Else If "%~aG" GEQ "d" (GoTo :EOF ) Else Set "TargetFile=" & Set "Mask=*%~xG"
C:\Users\Murray\Documents>If "--a--------" LSS "-" (GoTo :EOF ) Else If "--a--------" GEQ "d" (GoTo :EOF ) Else Set "TargetFile=" & Set "Mask=*.ovpn"
C:\Users\Murray\Documents>For /F "EOL=? Delims=" %G In ('C:\Windows\System32\xcopy.exe "C:\Program Files (x86)\Program\config\*.ssl" ? /HL | C:\Windows\System32\findstr.exe /N .') Do If "%~dG" == "1:" (Set "Target=%~nxG" ) Else If "%~dG" == "3:" Set "Target="
C:\Users\Murray\Documents>If "1:" == "1:" (Set "Target=Test_File.ssl" ) Else If "1:" == "3:" Set "Target="
C:\Users\Murray\Documents>If "2:" == "1:" (Set "Target=1 File(s)" ) Else If "2:" == "3:" Set "Target="
C:\Users\Murray\Documents>If Not Defined Target (GoTo :EOF ) Else If "Ai" == "0 " GoTo :EOF
C:\Users\Murray\Documents>Copy /Y "C:\Users\Murray\Desktop\My_Test_File.ssl" "C:\Program Files (x86)\Program\config\Test_File.ssl"
1 file(s) copied.
结果:虽然它说复制了一个文件,但在目标文件夹中我仍然看到 Test_File.ssl 而不是预期复制到目标的 My_Test_File.ssl。
以下代码只会将%SourceFile%
复制到%Destination%
,如果%SourceFile%
是一个现有文件,并且如果%Destination%
只包含一个文件与 %SourceFile%
.
相同的扩展名
@Echo Off
SetLocal EnableExtensions
Set "SourceFile=C:\Users\Murray\Desktop\My_File_Name_1.ssl"
Set "Destination=C:\Program Files (x86)\Program\config"
For %%G In ("%SourceFile%") Do If "%%~aG" Lss "-" (GoTo :EOF
) Else If "%%~aG" GEq "d" (GoTo :EOF) Else Set "TargetFile=" & Set "Mask=*%%~xG"
For /F "EOL=? Delims=" %%G In ('%SystemRoot%\System32\xcopy.exe
"%Destination%\%Mask%" ? /HL ^| %SystemRoot%\System32\findstr.exe /N .'
) Do If "%%~dG" == "1:" (Set "Target=%%~nxG"
) Else If "%%~dG" == "3:" Set "Target="
If Not Defined Target (GoTo :EOF) Else If "%Target:~,2%" == "0 " GoTo :EOF
Copy /Y "%SourceFile%" "%Destination%\%Target%"
您只能修改第 4
和 5
行的变量值以测试我的答案,其他任何内容都不得更改或添加。
请注意,与您的 一样,因为您提供的目标路径位于默认的受保护 Windows 目录中,您可能需要此脚本才能 运行 elevated/as 管理员,以获得所需的权限。
[编辑/]
上面的代码将您的源文件复制到目标位置,同时将其重命名为目标中具有该扩展名的文件的未知名称,即覆盖它。
如果您现在的任务是将源文件复制到目标位置,然后删除目标位置中具有相同扩展名但名称未知的文件,那么您只需替换最后一行:
Copy /Y "%SourceFile%" "%Destination%\%Target%"
这一行:
Copy "%SourceFile%" "%Destination%" && Del /A /F "%Destination%\%Target%"
由于您的任务似乎已从复制文件并覆盖现有文件更改为直接复制和删除过程,因此我的其他答案的以下改编代码略少:
@Echo Off
SetLocal EnableExtensions
Set "SourceFile=C:\Users\Murray\Desktop\My_File_Name_1.ssl"
Set "Destination=C:\Program Files (x86)\Program\config"
For %%G In ("%SourceFile%") Do If "%%~aG" Lss "-" (GoTo :EOF
) Else If "%%~aG" GEq "d" (GoTo :EOF) Else Set "Mask=*%%~xG"
For /F "EOL=? Delims=" %%G In ('%SystemRoot%\System32\xcopy.exe
"%Destination%\%Mask%" ? /HL') Do Set /A "Quantity=%%G" 2>NUL
If %Quantity% Equ 1 Del /A /F "%Destination%\%Mask%" 2>NUL && (
Copy "%SourceFile%" "%Destination%" 1>NUL)
这是我的批处理文件:
@echo off
copy /Y "C:\Users\Murray\Desktop\My_File_Name_1.ssl" "C:\Program Files (x86)\Program\config\*.ssl"
目标文件夹中有另一个扩展名为 ssl 的文件,但其名称始终不同。因此,我想复制我的文件,然后覆盖目标文件夹中的当前文件。但是,我不想在目标中指定文件名,因为它总是不同,但总是具有相同的扩展名(如示例中的 ssl)。此批处理文件将文件复制到目标文件夹,但保留其他带有 ssl 扩展名的文件。我错过了什么?
在 运行 之后输出:
C:\Users\Murray\Documents>mytest.bat
C:\Users\Murray\Documents>SetLocal EnableExtensions
C:\Users\Murray\Documents>Set "SourceFile=C:\Users\Murray\Desktop\My_Test_File.ssl"
C:\Users\Murray\Documents>Set "Destination=C:\Program Files (x86)\Program\config"
C:\Users\Murray\Documents>For %G In ("C:\Users\Murray\Desktop\My_Test_File.ssl") Do If "%~aG" LSS "-" (GoTo :EOF ) Else If "%~aG" GEQ "d" (GoTo :EOF ) Else Set "TargetFile=" & Set "Mask=*%~xG"
C:\Users\Murray\Documents>If "--a--------" LSS "-" (GoTo :EOF ) Else If "--a--------" GEQ "d" (GoTo :EOF ) Else Set "TargetFile=" & Set "Mask=*.ovpn"
C:\Users\Murray\Documents>For /F "EOL=? Delims=" %G In ('C:\Windows\System32\xcopy.exe "C:\Program Files (x86)\Program\config\*.ssl" ? /HL | C:\Windows\System32\findstr.exe /N .') Do If "%~dG" == "1:" (Set "Target=%~nxG" ) Else If "%~dG" == "3:" Set "Target="
C:\Users\Murray\Documents>If "1:" == "1:" (Set "Target=Test_File.ssl" ) Else If "1:" == "3:" Set "Target="
C:\Users\Murray\Documents>If "2:" == "1:" (Set "Target=1 File(s)" ) Else If "2:" == "3:" Set "Target="
C:\Users\Murray\Documents>If Not Defined Target (GoTo :EOF ) Else If "Ai" == "0 " GoTo :EOF
C:\Users\Murray\Documents>Copy /Y "C:\Users\Murray\Desktop\My_Test_File.ssl" "C:\Program Files (x86)\Program\config\Test_File.ssl"
1 file(s) copied.
结果:虽然它说复制了一个文件,但在目标文件夹中我仍然看到 Test_File.ssl 而不是预期复制到目标的 My_Test_File.ssl。
以下代码只会将%SourceFile%
复制到%Destination%
,如果%SourceFile%
是一个现有文件,并且如果%Destination%
只包含一个文件与 %SourceFile%
.
@Echo Off
SetLocal EnableExtensions
Set "SourceFile=C:\Users\Murray\Desktop\My_File_Name_1.ssl"
Set "Destination=C:\Program Files (x86)\Program\config"
For %%G In ("%SourceFile%") Do If "%%~aG" Lss "-" (GoTo :EOF
) Else If "%%~aG" GEq "d" (GoTo :EOF) Else Set "TargetFile=" & Set "Mask=*%%~xG"
For /F "EOL=? Delims=" %%G In ('%SystemRoot%\System32\xcopy.exe
"%Destination%\%Mask%" ? /HL ^| %SystemRoot%\System32\findstr.exe /N .'
) Do If "%%~dG" == "1:" (Set "Target=%%~nxG"
) Else If "%%~dG" == "3:" Set "Target="
If Not Defined Target (GoTo :EOF) Else If "%Target:~,2%" == "0 " GoTo :EOF
Copy /Y "%SourceFile%" "%Destination%\%Target%"
您只能修改第 4
和 5
行的变量值以测试我的答案,其他任何内容都不得更改或添加。
请注意,与您的
[编辑/]
上面的代码将您的源文件复制到目标位置,同时将其重命名为目标中具有该扩展名的文件的未知名称,即覆盖它。
如果您现在的任务是将源文件复制到目标位置,然后删除目标位置中具有相同扩展名但名称未知的文件,那么您只需替换最后一行:
Copy /Y "%SourceFile%" "%Destination%\%Target%"
这一行:
Copy "%SourceFile%" "%Destination%" && Del /A /F "%Destination%\%Target%"
由于您的任务似乎已从复制文件并覆盖现有文件更改为直接复制和删除过程,因此我的其他答案的以下改编代码略少:
@Echo Off
SetLocal EnableExtensions
Set "SourceFile=C:\Users\Murray\Desktop\My_File_Name_1.ssl"
Set "Destination=C:\Program Files (x86)\Program\config"
For %%G In ("%SourceFile%") Do If "%%~aG" Lss "-" (GoTo :EOF
) Else If "%%~aG" GEq "d" (GoTo :EOF) Else Set "Mask=*%%~xG"
For /F "EOL=? Delims=" %%G In ('%SystemRoot%\System32\xcopy.exe
"%Destination%\%Mask%" ? /HL') Do Set /A "Quantity=%%G" 2>NUL
If %Quantity% Equ 1 Del /A /F "%Destination%\%Mask%" 2>NUL && (
Copy "%SourceFile%" "%Destination%" 1>NUL)