打扰一下。你的问题不清楚。I assume您想要复制并重命名 10 个给定文件,但不是使用程序中给出的固定路径,而是使用程序运行时给出的可变路径。如果这是正确的,程序必须首先获取目标路径(只有一个),然后获取每个文件的源路径。
下面的批处理文件是实现前面过程的初步版本。如果这个解决方案是您想要的,那么可以添加路径的“浏览弹出窗口”部分,而不是简单的"set /P folder=Enter folder:"
命令。或者也许这个版本对你来说已经足够了?
EDIT:我修改了以下解决方案以包含这些新请求:
我有不同客户端的可变目标路径,例如客户端 a
路径将是 F:\Financial\ClientA\Data\%DateFolder%\Final Reports..&
对于客户 B“F:\Financial\ClientB\Data\%DateFolder%\Final Reports”
源路径与客户端 A 路径相同
"F:\Financial\Data\Reports\Client A\AccruntPnLMTD ;对于客户端 B 路径
将是 F:\Financial\Data\Reports\Client B\AccruntPnLMTD.. 文件夹
名称(AccruntPnLMTD、AccruntPnLMTD..etc)将重新命名为相同的
客户
最后编辑:下面的批处理文件已根据本答案最后一段进行了最后一次修改:浏览磁盘中现有的文件夹并选择一个.
@if (@CodeSection == @Batch) @then
@echo off
setlocal
rem Activate the browsing pop-up and ask for TargetFolder
for /F "delims=" %%a in ('CScript //nologo //E:JScript "%~F0" "Select the Target folder"') do (
set TargetFolder=%%a
)
rem Activate the browsing pop-up and ask for SourceFolder
for /F "delims=" %%a in ('CScript //nologo //E:JScript "%~F0" "Select the Source folder"') do (
set ClientSourceFolder=%%a
)
rem Process the list of "sourceFolder=fileName" pairs
for %%a in ("AccruntPnLMTD=PNL" "AccountPnlMTD=AC" "ExpensesMTD=EXPMTD" "ExpensesYTD=EXPYTD" "AccrualPnLYTD=PNLYTD"
"AccountYTD=ACYTD" "BalanceMTD=BSMTD" "BalanceYTD=BSYTD" "FinancialStmtMTD=FSMTD" "FinancialStmtYTD=FSYTD"
) do (
rem copy the newest file from sourceFolder and rename it to fileName.csv
for /F "tokens=1,2 delims==" %%b in (%%a) do (
call :copyAndRename "%%b" "%%c"
)
)
:: Done
goto :eof
:copyAndRename
set SourceFolder=%ClientSourceFolder%\%~1
set TargetFile=%TargetFolder%\%~2.csv
:: Find the newest file in the source folder
for /f "tokens=*" %%F in ('dir /b /od /a-d "%SourceFolder%"') do set
"NewestFile=%%F"
:: copy and rename it to the target
copy "%SourceFolder%\%NewestFile%" "%TargetFile%"
:: Done with this subroutine
goto :eof
@end
// JScript section
// Creates a dialog box that enables the user to select a folder.
// http://msdn.microsoft.com/en-us/library/windows/desktop/bb774065(v=vs.85).aspx
var shl = new ActiveXObject("Shell.Application");
var folder = shl.BrowseForFolder(0, WScript.Arguments(0), 0, 0);
WScript.Stdout.WriteLine(folder ? folder.self.path : "");
在这个新的解决方案中,您可以SELECT通过批处理文件的参数指定所需的客户端。例如,如果调用批处理文件example.bat
,对 ClientS 使用此命令:
example.bat ClientA
你必须注意的是浏览文件夹是一个交互式操作,呈现一个弹出窗口all现有文件夹并允许您选择其中之一。
EDIT: 添加了一些解释
看来这里有一个混乱。在您的问题中,您将以下内容显示为目标和源文件夹的示例:
set TargetFolder=F:\Financial\Data\%DateFolder%\Final Reports
:: copy the newest file from AccruntPnLMTD and rename it to PNL.csv
call :copyAndRename "F:\Financial\Data\Reports\AccruntPnLMTD"
然而,在事后评论你说:
I have variable target path for diffrent clients like for client a path wil be
F:\Financial\ClientA\Data\%DateFolder%\Final Reports..& for client B
F:\Financial\ClientB\Data\%DateFolder%\Final Reports
same goes in source path like Client A path
F:\Financial\Data\Reports\Client A\AccruntPnLMTD ; for client B Path will be
F:\Financial\Data\Reports\Client B\AccruntPnLMTD..
file folder names (AccruntPnLMTD,AccruntPnLMTD..etc) will reman same for each clients
您必须意识到之前的两种形式是完全不同:在第一个文件夹路径是constant,但在第二个文件夹路径中必须为每个客户进行更改。批处理文件解决方案始终是根据固定要求设计的。这一点在你的回答和评论中都没有明确,所以我以为某些细节以便编写批处理解决方案。我认为有两种方法可以解决这个问题,具体取决于问题是什么:
1- 为每个客户端选择适当的文件夹:在这种情况下,我假设路径文件夹具有以下形式:
目标文件夹由“F:\Financial\”组成,后跟选择每个客户端的可变部分,最后是“\Data\%DateFolder%\Final Reports”。
源路径由“F:\Financial\Data\Reports\”组成,后跟选择每个客户端的变量部分,然后是 10 个不同文件夹中的每一个(AccruntPnLMTD、AccruntPnLMTD ..等)。
If 这就是问题,然后我上面的解决方案就解决了。您只需将所需的文件夹名称作为批处理文件的参数即可。例如,如果客户端a的文件夹名称为“ClientA”,则执行以下命令:
nameOfTheBatchFile ClientA
如果客户端B的文件夹名称为“ClientB”,则执行以下命令:
nameOfTheBatchFile ClientB
如果文件夹名称有空格,请将其用引号引起来;例如,对于“任何其他客户端”执行以下命令:
nameOfTheBatchFile "Any other client"
然而,你后面的评论和坚持使用“浏览弹出窗口”、“询问路径”等术语让我认为前面解释的问题不是你想要解决的问题。还有另一种可能:
2- 浏览磁盘中现有的文件夹并选择一个:在这种情况下,当程序运行时,它会显示一个“浏览弹出”窗口,可以访问磁盘中的所有文件夹,并允许您选择其中任何一个。请注意,浏览窗口不能限制浏览任何特定的名称格式;如果您希望所选文件夹具有某些特征,例如放置在“Data\”部分之后的数据是“MM.YYYY”格式的今天日期或any其他限制,必须进行此检查after用户选择一个文件夹,程序会提示所选文件夹无效,并再次弹出浏览窗口。
我鼓励你clearly解释你的要求。请修改您原来的问题,以便任何人在阅读后都可以理解问题,并且不需要查看所有答案中的所有评论。