我的批处理脚本xcopy仍然要求F = file, D = directory确认,即使我已/F在脚本中添加,日志显示如下.请帮助我们如何避免要求确认.
脚本:
net use p: /delete
net use p: "\\200clan\F_Drive" /USER:adm /PERSISTENT:NO-1111
set source=%1
set target=p:/%2
echo %source% %target%
xcopy /S /I /Q /Y /F "%source%" "%target%"
Run Code Online (Sandbox Code Playgroud)
日志:
Run Code Online (Sandbox Code Playgroud)C:\test\foldera>xcopy /S /I /Q /Y /F "C:/test/folder1/folder2/logs/154/compareReport_177.html" "p:/Services/WSDLCompare/177_20151116/compareReport_177.html" Does P:\Services\WSDLCompare\177_20151116\UIReport_177.html specify a file name or directory name on the target (F = file, D = directory)?
asc*_*pfl 41
该/I开关(不/F,你在你的问题中提到)防止xcopy从询问目的地是否是文件或者只在多个源文件中给出的目录,所以如果源是一个目录,或者如果通配符?或*使用.如果目标已存在,则不会出现此类提示.
有以下方案(取决于提供的%source%和的值%target%):
单个源文件,目标是一个文件:
该/I开关是没用的,所以你需要管F到xcopy命令行:
echo F|xcopy /S /Q /Y /F "%source%" "%target%"
Run Code Online (Sandbox Code Playgroud)
如果/Y给出了切换(强制覆盖),你也可以提前创建目标文件(空文件):
>> "%target%" rem/
xcopy /S /Q /Y /F "%source%" "%target%"
Run Code Online (Sandbox Code Playgroud)单个源文件,目标是一个目录:
该/I开关是无用的太; 你可以管道D进入xcopy命令行:
echo D|xcopy /S /Q /Y /F "%source%" "%target%"
Run Code Online (Sandbox Code Playgroud)
或者您只需将a附加\到目的地:
xcopy /S /Q /Y /F "%source%" "%target%\"
Run Code Online (Sandbox Code Playgroud)
虽然这在例如%target%指定驱动器的当前目录时会引起麻烦D:,因为这D:意味着该驱动器的当前目录,而这D:\意味着它的根目录;
或者您提前创建目标目录:
2> nul mkdir "%target%"
xcopy /S /Q /Y /F "%source%" "%target%"
Run Code Online (Sandbox Code Playgroud)
2> nul如果目录已存在,该部分将抑制错误消息;
多个源文件,目标是一个文件:
这通常是一种无意义的情况,因为你告诉xcopy将每个源文件复制到同一目标文件,从而试图覆盖它;
多个源文件,目标是一个目录:
/I这里的开关很有意义:
xcopy /S /I /Q /Y /F "%source%" "%target%"
Run Code Online (Sandbox Code Playgroud)
管道选项也适用于此:
echo D|xcopy /S /Q /Y /F "%source%" "%target%"
Run Code Online (Sandbox Code Playgroud)
所以附加\到目的地(关于如上所述的限制):
xcopy /S /Q /Y /F "%source%" "%target%\"
Run Code Online (Sandbox Code Playgroud)
或者您提前创建目标目录:
2> nul mkdir "%target%"
xcopy /S /Q /Y /F "%source%" "%target%"
Run Code Online (Sandbox Code Playgroud)最灵活和安全的解决方案是将所需的选择(F或D)传递到xcopy命令行.(请注意,查询是与语言环境相关的.)
我想在这里提一下代码片段中的一些小问题:
\作为路径分隔符,因为这是用于此目的的Windows标准字符(尽管/在大多数情况下也有效);-1111附加到第二net use命令线; 如果这构成了资源的密码,则应在/USER选项之前移动; 否则只是删除它;set命令行引进一些特殊字符的问题(如&,^,(,)); 避免这种情况,状态set "source=%~1"和set "target=p:/%~2"; 的~消除潜在的周围""从参数(如果它们包含所需要SPACE,,,;,=);以下是重写所有上述内容的代码:
net use P: /DELETE
rem supposing `-1111` constitutes the password for the resource:
net use P: "\\200clan\F_Drive" -1111 /USER:adm /PERSISTENT:NO
set "source=%~1"
set "target=P:\%~2"
echo "%source%" "%target%"
rem supposing the destination is a directory:
echo D|xcopy /S /I /Q /Y /F "%source%" "%target%"
rem actually you do not need any interim variables:
REM echo D|xcopy /S /I /Q /Y /F "%~1" "P:\%~2"
Run Code Online (Sandbox Code Playgroud)
小智 22
在目标文件后面放一个*.这会抑制问题并默认为File.
Xcopy file1 file2*
Xcopy file1 file2\
Run Code Online (Sandbox Code Playgroud)
默认为文件夹.
Dom*_*que 12
xcopy不知道目标是一个目录.你通过在结尾处加上反斜杠来阐明这一点:
xcopy /S /I /Q /Y /F "%source%" "%target%\"
Run Code Online (Sandbox Code Playgroud)
小智 9
使用 XCOPY 复制单个文件时,没有选项指示目标是文件名还是目录(文件名默认为源文件的文件名)。在这种情况下,XCOPY 将提示一条(特定于语言环境的)消息,例如:
C:> xcopy foo.txt bar.txt
它提示 foo.txt 是否在目标上指定了文件名或目录名(F = 文件,D = 目录)?
在目标末尾添加通配符 (*) 将取消此提示并默认复制为文件:
C:> xcopy foo.txt bar.txt* 1 已复制文件
这要求源文件扩展名和目标文件扩展名的长度相同,通常为 3 个字符。
更多信息:https : //ss64.com/nt/xcopy.html
| 归档时间: |
|
| 查看次数: |
51378 次 |
| 最近记录: |