0

在 Windows 机器(cWrsync)上使用 rsync,我正在将一个带有子目录的大文件夹同步到需要几分钟才能完成的 Web 服务器。但是当用户只需要将文件添加到子目录时,我不希望他们不得不等待一个小时来同步该目录。

我的想法 在每个子目录 (1_sync.bat) 中添加一个文件,当他们在该目录中添加或删除文件时可以执行该文件。我需要批处理文件能够动态地告诉 rsync 要同步哪个目录。这是静态版本:

@echo off
REM Make environment variable changes local to this batch file
SETLOCAL

REM where ti find rsync and related files
SET CWRSYNCHOME=C:\cwRsync

SET HOME=C:\Users\greg\AppData\Roaming

SET CWORLDPATH=%PATH%
SET PATH=%CWRSYNCHOME%\BIN;%PATH%

"C:\cwRsync\bin\rsync.exe" -v -e 'ssh -i C:\home\greg\.ssh\id_rsa' --delete --recursive --inplace  "/cygdrive/z/1CustomerDocs/2017/Client Folder/" "root@domainname.com:/var/storage/customer_files/2017/Client\ Folder/"

在上面的示例中,我希望 Client Folder 是一个变量,它将检测批处理脚本实际在哪个文件夹中,这样我就可以通过每个子目录中的一个 bat 文件。

我尝试了 %~dp0 ,它几乎可以解决问题,但输出了整个路径。我只需要最后两个目录。

所以如果 %~dp0 = \SERVER-PATH\Content\1CustomerDocs\2017\Client Folder\

我希望我可以切断最后两个目录并有一个看起来像的变量

2017/Client 文件夹(但也需要一个为 linux 转义空格的文件夹)

所以最终结果看起来像

@echo off
REM Make environment variable changes local to this batch file
SETLOCAL

REM where ti find rsync and related files
SET CWRSYNCHOME=C:\cwRsync

SET HOME=C:\Users\greg\AppData\Roaming

SET CWORLDPATH=%PATH%
SET PATH=%CWRSYNCHOME%\BIN;%PATH%

SET CUST_FOLDER_WINDOWS=*YOUR HELP NEEDED HERE*
SET CUST_FOLDER_LINUX=*YOUR HELP NEEDED HERE*

"C:\cwRsync\bin\rsync.exe" -v -e 'ssh -i C:\home\greg\.ssh\id_rsa' --delete --recursive --inplace  "/cygdrive/z/1CustomerDocs/%CUST_FOLDER_WINDOWS%" "root@domainname.com:/var/storage/customer_files/%CUST_FOLDER_LINUX%"

再说一次,我需要 linux 文件夹来转义空格。

谢谢您的帮助!

4

2 回答 2

1

要独立于当前目录级别:

@echo off
Echo current dir %CD%
Echo Batch dir   %~dp0
for %%a in ("%~dp0.")  Do Set "Parent=%%~nxa"
for %%a in ("%~dp0..") Do Set "Grandparent=%%~nxa"

Echo Last 2 dirs \%Grandparent%\%Parent%

current dir Q:\Test\2017\08\10
Batch dir   Q:\Test\2017\08\10\
Last 2 dirs \08\10
于 2017-08-10T21:29:23.913 回答
0

在下面想通了

@echo off
REM Make environment variable changes local to this batch file
SETLOCAL


REM where ti find rsync and related files
SET CWRSYNCHOME=C:\cwRsync

SET HOME=C:\Users\greg\AppData\Roaming

SET CWORLDPATH=%PATH%
SET PATH=%CWRSYNCHOME%\BIN;%PATH%

for /F "tokens=5,6 delims=\" %%a in ("%0") do (
"C:\cwRsync\bin\rsync.exe" -v -e 'ssh -i C:\home\greg\.ssh\id_rsa' --delete --
recursive --inplace  "/cygdrive/z/1CustomerDocs/%%a/%%b/" 
"root@domainname.com:/var/storage/customer_files/%%a/%%b/"
)
于 2017-08-10T21:14:48.067 回答