3

以下のスクリプトがあります。これには、ターゲット パス (1 つだけ) と別のソース パス (変数) の 2 つのパスがあります。

以下のスクリプト関数について: 私はこれを月に 1 回実行し、ソース パス (10 パス) に移動し、lates ファイルをコピーしてから、ターゲット パスにコピーして名前を変更します (すべてのファイルに共通)。

注: resacted ソースからコピーされたファイルは、次のようなスクリプトに従って名前を変更する必要があります。「F:\Financial\Data\Reports\AccruntPnLMTD」からのファイルは、「PNL.csv」と名前を変更する必要があります。

@echo off
setlocal
set DateFolder=04.2013
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" "%TargetFolder%\PNL.csv"

:: copy the newest file from AccountPnlMTD and rename it to AC.csv
call :copyAndRename "F:\Financial\Data\Reports\AccountPnlMTD" "%TargetFolder%\AC.csv"

:: copy the newest file from ExpensesMTD and rename it to EXPMTD.csv
call :copyAndRename "F:\Financial\Data\Reports\ExpensesMTD" "%TargetFolder%\EXPMTD.csv"

:: copy the newest file from ExpensesYTD and rename it to EXPYTD.csv
call :copyAndRename "F:\Financial\Data\Reports\ExpensesYTD" "%TargetFolder%\EXPYTD.csv"

:: copy the newest file from AccrualPnLYTD and rename it to PNLYTD.csv
call :copyAndRename "F:\Financial\Data\Reports\AccrualPnLYTD" "%TargetFolder%\PNLYTD.csv"

:: copy the newest file from AccountYTD and rename it to ACYTD.csv
call :copyAndRename "F:\Financial\Data\Reports\AccountYTD" "%TargetFolder%\ACYTD.csv"

:: copy the newest file from BalanceMTD and rename it to BSMTD.csv
call :copyAndRename "F:\Financial\Data\Reports\BalanceMTD" "%TargetFolder%\BSMTD.csv"

:: copy the newest file from BalanceYTD and rename it to BSYTD.csv
call :copyAndRename "F:\Financial\Data\Reports\BalanceYTD" "%TargetFolder%\BSYTD.csv"

:: copy the newest file from FinancialStmtMTD and rename it to FSMTD.csv
call :copyAndRename "F:\Financial\Data\Reports\FinancialStmtMTD" "%TargetFolder%\FSMTD.csv"

:: copy the newest file from FinancialStmtYTD and rename it to FSYTD.csv
call :copyAndRename "F:\Financial\Data\Reports\FinancialStmtYTD" "%TargetFolder%\FSYTD.csv"


:: Done
goto :eof

:copyAndRename
set SourceFolder=%~1
set TargetFile=%~2

:: 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

スクリプトの実行後に両方のパスを指定したい(ポップアップでパスを要求する必要があります)

4

2 に答える 2

0

すみません。あなたの質問は明確ではありません。10 個の指定されたファイルをコピーして名前を変更したいが、プログラムで指定された固定パスではなく、プログラムの実行時に指定された変数パスを使用すると仮定します。これが正しい場合、プログラムは最初にターゲット パス (1 つだけ) を取得し、次に各ファイルのソース パスを取得する必要があります。

以下のバッチファイルは、以前のプロセスを実現する暫定版です。この解決策が必要な場合は、単純な"set /P folder=Enter folder:"コマンドの代わりに、パスの「閲覧ポップアップ」部分を追加できます。それとも、このバージョンで十分ですか?

編集:これらの新しいリクエストを含めるために、以下のソリューションを変更しました:

クライアントのように、さまざまなクライアントの可変ターゲット パスがあります。パスは F:\Financial\ClientA\Data\%DateFolder%\Final Reports..& クライアント B の場合は "F:\Financial\ClientB\Data\%DateFolder%\" になります。最終報告」

クライアント A のパス "F:\Financial\Data\Reports\Client A\AccruntPnLMTD" のようなソース パスでも同様です。クライアント B の場合、パスは F:\Financial\Data\Reports\Client B\AccruntPnLMTD..file フォルダー名 (AccruntPnLMTD) になります。 ,AccruntPnLMTD..etc) は、各クライアントで同じままになります。

最終編集: 以下のバッチ ファイルは、この回答の最後の段落に従って最後に変更されています:ディスク内の既存のフォルダーを参照して、1 つを選びます。

@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 : "");

この新しいソリューションでは、バッチ ファイルのパラメーターを介して目的のクライアントを選択できます。たとえば、バッチ ファイルの名前が の場合、example.batClientA に対して次のコマンドを使用します。

example.bat ClientA

BROWSING FOR A FOLDERは、存在するすべてのフォルダを含むポップアップ ウィンドウを表示し、そのうちの 1 つを選択できるインタラクティブな操作であることに注意してください。

編集いくつかの説明が追加されました

ここで混乱が生じているようです。あなたの質問では、ターゲット フォルダーとソース フォルダーの例として次のものを示します。

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

前の 2 つの形式はまったく異なることに注意してください。最初の形式ではフォルダ パスは一定ですが、2 番目の形式ではクライアントごとにフォルダ パスを変更する必要があります。バッチ ファイル ソリューションは、常に固定要件で設計されています。この点はあなたの回答でもコメントでも明確ではないため、バッチソリューションを作成するために特定の詳細を想定しました。問題の内容に応じて、この問題を解決するには2つの方法があると思います。

1-各クライアントに適切なフォルダーを選択します。この場合、パスフォルダーは次の形式であると想定しました。

ターゲット フォルダは、"F:\Financial\" の後に各クライアントを選択する変数部分が続き、その後に "\Data\%DateFolder%\Final Reports" が続きます。

ソース パスは、「F:\Financial\Data\Reports\」の後に各クライアントを選択する変数部分が続き、その後に 10 個の異なるフォルダー (AccruntPnLMTD、AccruntPnLMTD など) のそれぞれが続きます。

これが問題である場合は、上記の私の解決策で解決します。必要なフォルダー名をバッチ ファイルのパラメーターとして配置するだけです。たとえば、クライアント a のフォルダーの名前が「ClientA」の場合、次のコマンドを実行します。

nameOfTheBatchFile ClientA

クライアント B のフォルダーの名前が「ClientB」の場合、次のコマンドを実行します。

nameOfTheBatchFile ClientB

フォルダーの名前にスペースが含まれる場合は、引用符で囲みます。たとえば、「その他のクライアント」の場合、次のコマンドを実行します。

nameOfTheBatchFile "Any other client"

ただし、「ポップアップを閲覧する」、「パスを要求する」などの用語を使用することに対するあなたの事後のコメントと主張は、以前に説明した問題はあなたが解決したいものではないと私に思わせます。別の可能性があります。

2-ディスク内の既存のフォルダを参照して 1 つ選択します。この場合、プログラムを実行すると、ディスク内のすべてのフォルダにアクセスできる「参照ポップアップ」ウィンドウが表示され、それらのいずれかを選択できます。ブラウジング ウィンドウは、特定の名前形式のブラウズを制限できないことに注意してください。選択したフォルダに特定の特性を持たせたい場合、たとえば「Data\」部分の後に配置されたデータを「MM.YYYY」形式の今日の日付にするなどの制限がある場合、このチェックはユーザーがフォルダを選択したに行う必要があります。プログラムは、選択したフォルダが無効であることを示し、参照ウィンドウを再度ポップアップします。

要件を明確に説明することをお勧めします。元の質問を修正して、誰でも読んだ後に問題を理解できるようにし、すべての回答のすべてのコメントを確認する必要がないようにしてください。

于 2013-05-29T18:50:21.007 に答える
0

これはテストされていません。コードをポップアップ ルーチンとマージし、すべてのフォルダがあるはずのソース フォルダを 1 回要求します。

@echo off
setlocal
set DateFolder=04.2013
:: set the source and target folders
call :getpath

set "TargetFolder=%TargetFolder%\%DateFolder%\Final Reports"


:: copy the newest file from AccruntPnLMTD and rename it to PNL.csv
call :copyAndRename "AccruntPnLMTD" "%TargetFolder%\PNL.csv"

:: copy the newest file from AccountPnlMTD and rename it to AC.csv
call :copyAndRename "AccountPnlMTD" "%TargetFolder%\AC.csv"

:: copy the newest file from ExpensesMTD and rename it to EXPMTD.csv
call :copyAndRename "ExpensesMTD" "%TargetFolder%\EXPMTD.csv"

:: copy the newest file from ExpensesYTD and rename it to EXPYTD.csv
call :copyAndRename "ExpensesYTD" "%TargetFolder%\EXPYTD.csv"

:: copy the newest file from AccrualPnLYTD and rename it to PNLYTD.csv
call :copyAndRename "AccrualPnLYTD" "%TargetFolder%\PNLYTD.csv"

:: copy the newest file from AccountYTD and rename it to ACYTD.csv
call :copyAndRename "AccountYTD" "%TargetFolder%\ACYTD.csv"

:: copy the newest file from BalanceMTD and rename it to BSMTD.csv
call :copyAndRename "BalanceMTD" "%TargetFolder%\BSMTD.csv"

:: copy the newest file from BalanceYTD and rename it to BSYTD.csv
call :copyAndRename "BalanceYTD" "%TargetFolder%\BSYTD.csv"

:: copy the newest file from FinancialStmtMTD and rename it to FSMTD.csv
call :copyAndRename "FinancialStmtMTD" "%TargetFolder%\FSMTD.csv"

:: copy the newest file from FinancialStmtYTD and rename it to FSYTD.csv
call :copyAndRename "FinancialStmtYTD" "%TargetFolder%\FSYTD.csv"


:: Done
goto :eof

:copyAndRename
set "FileFolder=%SourceFolder%\%~1"
set "TargetFile=%~2"

echo copying "%FileFolder%"

:: Find the newest file in the source folder
for /f "tokens=*" %%F in ('dir /b /od /a-d "%FileFolder%"') do set "NewestFile=%%F"

:: copy and rename it to the target
copy "%FileFolder%\%NewestFile%" "%TargetFile%" >nul


:: Done with this subroutine
goto :eof

:getsourcepath

Call :BrowseFolder "Choose Source folder" "C:\Program Files\"
Set "SourceFolder=%Result%"

Call :BrowseFolder "Choose Target folder" "C:\Users\"
Set TargetFolder=%Result% 

REM echo %SourceFolder%
REM echo %TargetFolder%

:: Done
goto :eof


:BrowseFolder
set Result=
set input="%~1" & set default="%~2"
:: Temporary files
set vbs=%temp%\_.vbs
set tmp=%temp%\_.cmd
:: Build VBScript file
findstr "'%skip%VBS" "%~f0" > "%vbs%"
:: Run the script with WSH and set Path as Env variable %Result%
for /f "delims=" %%a in ('cscript /nologo "%vbs%" ') do set "Result=%%a"
DEL %VBS%
set vbs= & set tmp= & set input= & set default=
goto :EOF

set WshShell=WScript.CreateObject("WScript.Shell") 'VBS
set shell=WScript.CreateObject("Shell.Application") 'VBS
sInput=WshShell.ExpandEnvironmentStrings("%input%") 'VBS
sDefault=WshShell.ExpandEnvironmentStrings("%default%") 'VBS
sInput = Replace(sInput, chr(34), "") 'VBS
sDefault = replace(sDefault,chr(34),"") 'VBS
set folder=shell.BrowseForFolder(0,sInput,0,sDefault) 'VBS
if typename(folder)="Nothing" Then  'VBS
wscript.echo "set Result=Dialog Cancelled" 'VBS
WScript.Quit(1) 'VBS
end if 'VBS
set folderItems=folder.Items() 'VBS
set folderItem=folderItems.Item() 'VBS
pathname=folderItem.Path 'VBS
wscript.echo pathname 'VBS
于 2013-05-29T11:20:33.127 に答える