फ़ाइलों को स्वचालित रूप से एक स्थान से दूसरे स्थान पर कॉपी करना


0

मेरे पास मूर्खतापूर्ण प्रश्न है लेकिन, मैं जानना चाहूंगा कि मैं एक .bat फ़ाइल के साथ निम्नलिखित कैसे कर सकता हूं या यह भी जान सकता हूं कि क्या यह संभव है।

मेरे पास एक फ़ाइल है जो किसी सर्वर पर एक फ़ोल्डर में रखता है जो मेरे नेटवर्क पर नहीं है (लेकिन हमारे पास पहुंच है क्योंकि हम डोमेन में हैं) इसलिए, मुझे सबसे हाल ही में खोज करना होगा और इसे उस फ़ोल्डर में कॉपी करना होगा जो आईएस है मेरे नेटवर्क में

मैं उस हिस्से में फंस गया हूं जिसमें आप "सबसे हाल की फ़ाइल" का चयन करते हैं

किसी भी विचार वास्तव में वेलकम होगा :)

जवाबों:


1

मैंने हाल ही में एक पर्ल स्क्रिप्ट बनाई है जो वास्तव में ऐसा करती है। जब आप इस स्क्रिप्ट को लॉन्च करते हैं, तो यह खोज करता है कि क्या कोई और हाल की ज़िप फ़ाइल है, इसे कॉपी करता है, इसे निकालता है, एक कॉन्फ़िगर फ़ाइल को संशोधित करता है और EXE लॉन्च करता है। हो सकता है कि आप यह सब नहीं करना चाहते, लेकिन अगर आप इसे संशोधित / उपयोग करना चाहते हैं तो मैं इसे यहाँ पोस्ट करूँगा।

#!/usr/bin/perl
# get_latest_executable.pl v0.5
# Usage: perl get_latest_executable.pl test4|test6 [country] [language]
###############
# YD @ 02/09/2011
# 05/09/2011    Multiple transparent compression options
#               Fixed config file backup
#               Removed useless debug code
# 12/09/2011    Added external configuration file
#               Removed internal arrays with options, script argument is trusted now
# 15/09/2011    Added informing latest executable date
#               More comments and intro
# 19/09/2011    Bug retreiving versions higher than 99 (fixed)
#               Now checking latest executable is done on file creation time and no longer using version
# 27/09/2011    Fixed extra trailing \ on destination path
# 28/09/2011    Added commenting out all user.dll's updateUserConfiguration entry
#               Now user.dll file is parsed until the end, and does not stop when first searched entry is found
###############

use strict;
use File::stat;
use File::Path qw(make_path remove_tree);
use File::Copy;

use constant VERSION => "v0.5";
use constant TIMESTAMP_FORMAT => "%02d:%02d %02d/%02d/%4d"; # Formato del informe de fecha

##########
# Args
##########
use constant MIN_ARGS => 0;
use constant MAX_ARGS => 2;

##########
# Indexes
##########
use constant IDX_TEST4 => 0;
use constant IDX_TEST6 => 1;
my $executable_branch;

##########
# Paths
##########
my $path_source;
# Where to copy the executable in local
my $path_destination;
# Where to search for latest executable
my $path_latest_executable;

##########
# File names
##########
# SGCV10 executable name
my $executable_name = 'gccom.exe';
# SGCV10 config file name
my $config_file = "user.dll";
# Script configuration file
my $config = "config.txt";

##########
# Compressors
##########
my @compressors = ('"C:\Archivos de programa\7-Zip\7z.exe" x -y ', '"C:\Archivos de programa\WinZip\winzip32.exe" -e ');

##########
# SGCV10 configuration
##########
my $do_config_changes = "";
my $backup_prefix = '.bak';
my $country = "es";
my $country_option = '(^COUNTRY=)';
my $lang = "ES";
my $lang_option = '(^LANGUAGE=)';
my $update_option = '^updateUserConfiguration=';

##########
# Script configuration
##########
my $source = '^SOURCE=(.*)\n';
my $destination = '^DESTINATION=(.*)\n';

# Checks arguments received by the script
sub check_args()
{
    if ($#ARGV > MAX_ARGS || $#ARGV < MIN_ARGS)
    {
        print(STDERR "Numero de argumentos incorrecto\n");
        print(STDERR "Uso: perl get_latest_executable.pl test4|test6 [country] [language]\n");
        exit();
    }

    $executable_branch = $ARGV[0];

    if ($#ARGV >= 1)
    {
        $do_config_changes = "1";
        $country = $ARGV[1];
    }

    if ($#ARGV == 2)
    {
        $lang = uc($ARGV[2]);
    }
}

# Returns true if file "a" is newer than file "b"
sub is_newer_version
{
    my ($a_path, $b_path) = @_;
    my $ret = "1";

    if ($b_path ne "")
    {
        my $a_time = stat($a_path)->mtime;
        my $b_time = stat($b_path)->mtime;

        $ret = $a_time > $b_time;
    }

    return $ret;
}

# Receives executable directory
# Returns latest zip full path
sub get_latest_zip_full_path
{
    my $path = shift;
    my $ret;

    if (-d $path)
    {   
        opendir(DH, $path) or die ("No se pudo abrir el directorio: $path\n");
        my @dir = readdir(DH);
        close(DH);
        my $newest = 0;

        for(@dir)
        {
            my $full_path = $path.$_;
            if (-f $full_path && $_ =~ m/zip/i)
            {
                my $cur_file_time = stat($full_path)->mtime;
                if($cur_file_time > $newest)
                {
                    $newest = $cur_file_time;
                    $ret = $full_path;
                }
            }
        }
    }

    return $ret;
}

# Returns true if local executable is OLDER than remote executable, false otherwise
# Creates local directory if not found, deletes older executable .ZIP and directory
sub check_local_delete
{
    my ($local_dir, $local_latest, $remote_path) = @_;
    my $ret = "";

    # Local directory exists
    if(-d $local_dir)
    {
        if (is_newer_version($remote_path, $local_latest))
        {
            print(STDERR "Borrando ejecutable obsoleto: $local_latest\n");

            # Delete older local ZIP
            unlink($local_latest);

            # Delete old directory
            $local_latest =~ s/\.zip//;
            if (-d $local_latest)
            {
                remove_tree($local_latest);
            }
            $ret = "1";
        }
    }
    # Local directory does not exist, create it and return remote newer
    else
    {
        make_path($local_dir);
        $ret = "1";
    }
    return $ret;
}

# Given a full path, returns filename only
sub get_filename_from_full_path
{
    my $full_path = shift;

    my $ret = reverse($full_path);
    $ret =~ m/\\/;
    $ret = $`;
    $ret = reverse($ret);

    return $ret;
}

# Modifies SGCv10 configuration
sub make_config_changes
{
    my $path = shift;
    my $config_path = $path.$config_file;
    if (-f $config_path)
    {
        open(FD, '<'.$config_path);
        my @config = <FD>;
        close(FD);

        # Backup original file (only if not backed up already!!!)
        if (!(-f $config_path.$backup_prefix))
        {
            copy($config_path, $config_path.$backup_prefix);
        }

        # Modify it
        my $i = 0;
        while($i <= $#config)
        {           
            if ($config[$i] =~ /$country_option/)
            {
                $config[$i] = $1.$country."\n";             
            }
            if ($config[$i] =~ /$lang_option/)
            {
                $config[$i] = $1.$lang."\n";
            }
            if ($config[$i] =~ /$update_option/)
            {
                $config[$i] = "//" . $config[$i];
            }
            $i++;
        }   

        # Write it
        open(FD, '>'.$config_path);
        print(FD @config);
        close(FD);
    }
    else
    {
        print(STDERR "WARNING: config file $config_path not found!\n");
    }
}

# Selects best command to decompress with
sub get_best_compressor
{
    my $ret;
    my $i = 0;
    my $found = ""; 
    while($i <= $#compressors && !$found)
    {
        $compressors[$i] =~ m/\"(.*)\"/;
        if (-f $1)
        {
            $ret = $compressors[$i];
            $found = "1";
        }
    }

    if (!$found)
    {
        $ret = -1;
    }

    return $ret;
}

# Reads and applies configuration file
sub read_config
{
    open(FD, '<'.$config) or die "No se encontro el fichero de configuracion $config\n";
    my @config = <FD>;
    close(FD);

    # Source
    my @source_list = grep(/$source/, @config);
    my $src = $source_list[0];
    $src =~ /$source/;
    $src = $1;
    if (substr($src, -1, 1) ne "\\")
    {
        $src .= "\\";
    }
    $path_latest_executable = uc("$src$executable_branch\\");

    # Destination
    my @dest_list = grep(/$destination/, @config);
    $path_destination = $dest_list[0];
    $path_destination =~ /$destination/;
    $path_destination = uc($1);
    if (substr($path_destination, -1, 1) ne "\\")
    {
        $path_destination .= "\\";
    }
}

# Formatea el tiempo
sub format_timestamp
{
    my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = @_;
    return sprintf(TIMESTAMP_FORMAT, $hour, $min, $mday, $mon+1, $year+1900);
}

# Basurilla
sub intro
{
    print(STDERR "AutoEjecutable " . VERSION . " by Obi Perl Kenobi\n\n");
}

#############
# MAIN
#############

# Show intro
intro();

# Checking arguments
check_args();

# Read configuration file
read_config();

if (!(-d $path_latest_executable))
{
    print(STDERR "No se ha encontrado el directorio origen $path_latest_executable\n");
    exit();
}

# Getting latest executable
my $latest_zip_full_path = get_latest_zip_full_path($path_latest_executable);

# Getting time stamp
my $latest_zip_time = format_timestamp(localtime(stat($latest_zip_full_path)->mtime));

print(STDERR "Ultimo ejecutable disponible: $latest_zip_full_path -> $latest_zip_time\n");

# Checking if latest executable newer than local
$path_destination .= $executable_branch."\\";
if (check_local_delete($path_destination, get_latest_zip_full_path($path_destination), $latest_zip_full_path))
{
    print(STDERR "El ejecutable remoto es mas reciente ($latest_zip_time), copiando... ");
    # Copying executable to local
    copy($latest_zip_full_path, $path_destination);
}
else
{
    print(STDERR "No hay cambios!\n");
}

my $path_aux = $path_destination.get_filename_from_full_path($latest_zip_full_path);
my $local_exe_dir = $path_aux;
$local_exe_dir =~ s/\.zip//;
$local_exe_dir .= "\\";
if (-f $path_aux && !(-d $local_exe_dir))
{
    # Choose extractor
    my $extractor_command = get_best_compressor();
    if ($extractor_command == -1)
    {
        print(STDERR "No se pudo encontrar ningun programa de descompresión. Por favor modifique las rutas en el script si no usa la instalación por defecto\n");
        exit();
    }
    # Extract ZIP
    chdir($path_destination);
    print(STDERR "Extrayendo...\n");
    $extractor_command .= '"' . $path_aux . '"';
    system($extractor_command);
}

chdir($local_exe_dir);

if ($do_config_changes)
{
    print(STDERR "Modificando configuracion para pais $country y lengua $lang...\n");
    make_config_changes($local_exe_dir);
}

my $local_exe = '"' . $local_exe_dir.$executable_name . '"';
print(STDERR "Lanzando el ejecutable $local_exe de las $latest_zip_time\n");
system($local_exe);

Get_latest_zip_full_path () सबरूटीन वह करता है जो आप मांग रहे हैं।

यह एक बाहरी विन्यास फाइल का उपयोग करता है, इस प्रकार है:

SOURCE=J:\Ejecutables\
DESTINATION=D:\SGCv10\ejecutables\

यह आपकी समस्या के लिए "जैसा है" काम नहीं करेगा। अपनी इच्छानुसार संशोधित और उपयोग करने के लिए स्वतंत्र महसूस करें, साथ ही पूछें कि आप क्या चाहते हैं।


आपका बहुत बहुत धन्यवाद! मैं स्पेन से हूं इसलिए मुझे यह समझने में दिक्कत नहीं होगी। अब मुझे यह पता लगाना है कि अपनी आवश्यकताओं के अनुरूप कैसे संशोधित किया जाए, लेकिन बहुत आसान लगता है :)
एंटोनियो लगुना

मुझे लगता है कि आप नाम से एक स्पेनिश बोलने वाले देश से थे;) वैसे भी, अगर आपको इसे संशोधित करने में मदद की ज़रूरत है, तो पूछने में संकोच न करें। और btw, मैं यह उल्लेख करने के लिए सक्षम होने के लिए आपको एक पर्ल दुभाषिया की आवश्यकता का उल्लेख करना भूल गया। मैं ActivePerl की सलाह देता हूं।
m0skit0

1

आपको इन प्रकार के कार्यों के लिए रोबोकॉपी पर एक नज़र रखना चाहिए। यह पहले Windows संस्करण में संसाधन किट का हिस्सा था, लेकिन अब यह भाग foe Win2k8 सर्वर और विंडोज 7 है। फ़ाइल चयन विकल्प का एक पूरा सेट है जो इस कार्य में मदद करता है।


1

यह डायरेक्टरी ट्री को मिरर करेगा। स्रोत से विभिन्न फ़ाइलों की प्रतिलिपि बनाएँ, और गंतव्य में अतिरिक्त फ़ाइलों को हटा दें

ROBOCOPY source destination /MIR

यह पुरानी फ़ाइलों को छोड़कर खाली लोगों सहित उपनिर्देशिकाओं की नकल करेगा।

ROBOCOPY source destination /E /XO

0

आप यूनिक्स रिमोट कॉपी टूल rsync, cwRsync का एक Windows संस्करण आज़मा सकते हैं :

cwRsync Rsync और Cygwin की एक और पैकेजिंग है। आप तेज दूरस्थ फ़ाइल बैकअप और सिंक्रनाइज़ेशन के लिए cwRsync का उपयोग कर सकते हैं। रुपीक रुपीक एल्गोरिथ्म का उपयोग करता है जो दूरस्थ फ़ाइलों को सिंक में लाने के लिए बहुत तेज़ विधि प्रदान करता है।

यह आपके द्वारा बताई गई जरूरत को पूरा करना चाहिए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.