बैच फ़ाइल यदि कमांड


0

मैं पहली बार बैच फ़ाइल बनाने का प्रयास कर रहा हूं। यह एक ऐसी फाइल को डाउनलोड करना होगा जिसे हर हफ्ते एक बार नई आईडी के साथ अपडेट किया जा रहा है। यह बैच फ़ाइल है जो मैंने अब तक बनाई है -

@echo off
echo open SERVER> temp.txt
echo USERNAME>> temp.txt
echo PWD>> temp.txt
echo cd />> temp.txt
echo cd Events/_PPV_Barker>> temp.txt
echo binary>> temp.txt
echo get Barker*_480i.ts>> temp.txt 
ftp -s:temp.txt
del temp.txt

मुझे पता है कि हर बार नई फ़ाइल सर्वर पर अपलोड की जाएगी, फ़ाइल नाम की शुरुआत होगी Barkerऔर फ़ाइल का नाम समाप्त हो जाएगा 480i.ts। मैंने कोशिश की * जैसा ऊपर दिखाया गया है, लेकिन यह काम नहीं करता है। यदि मैं हर बार एक अद्वितीय आईडी के साथ फ़ाइल प्राप्त करने के लिए कमांड का उपयोग कैसे कर सकता हूं? या क्या इसके अलावा कोई और तरीका है अगर कमांड?

किसी भी तरह की सहायता को आभार समझेंगे।

धन्यवाद

केशव


linux में आपकी पहुंच / dev / random या / dev / urandom या similiar तक है। आप वहां से 10 बाइट ले सकते हैं, और ओवरलैप की संभावना कम है। इसके अलावा शायद आप वहाँ तारीख को हिला सकते हैं। % M% d% y जैसा कुछ, इसे देखना होगा।
साइबरनार्ड

@cybernard ऐसा लगता है कि यह एक लिनक्स सिस्टम पर अपलोड है, इसलिए उनके पास बैच फ़ाइल से उन निर्देशिकाओं तक पहुंच नहीं होगी।
हर्ब वोल्फ

क्या हम इस बात का नमूना देख सकते हैं कि अद्वितीय क्या है, क्योंकि तिथि और समय अद्वितीय हैं, लेकिन हम नहीं जानते कि पैटर्न क्या है?
साइबरनार्ड

क्या यह "Barker" शुरू करने वाली निर्देशिका की एकमात्र फ़ाइल है? या एक से अधिक हैं?
uSlackr

1
BTW, आप वास्तव में एफ़टीपी स्क्रिप्टिंग कर रहे हैं, न कि विंडोज़ बैच। `IF if ftp में समर्थित नहीं है।
uSlackr

जवाबों:


1

यदि मैं आपको सही तरीके से समझता हूं, तो हर बार जब आप सर्वर तक पहुँचते हैं तो एक नई फ़ाइल होती है, लेकिन आपको इसके नाम का विवरण नहीं पता होता है। मुझे नहीं पता कि आपके द्वारा डाउन-लोड किए जाने के बाद फ़ाइल को निकाला गया है या नहीं, या फिर आपके पास लगातार बढ़ती हुई संख्या है और आपको नवीनतम चुनना है।

सबसे सरल मामले में, केवल एक फ़ाइल है, और यहां आपका समाधान लगभग सही है: एक साधारण बदलाव की आवश्यकता है, getजिसे बदलने के लिए mget, जब वाइल्ड कार्ड *काम करेगा: -

echo mget Barker*_480i.ts>> temp.txt

यदि ऐसी कई फाइलें हैं जो इस फ़ाइल मास्क से मेल खाती हैं, तो आप प्रत्येक एक्सेस पर फ़ाइलों की बढ़ती संख्या को डाउन-लोड करेंगे। एक त्वरित और गंदी फिक्स है कि आप फ़ाइलों को अपनी वर्तमान निर्देशिका में रखें और उन्हें केवल पढ़ने के लिए बनाएं: आपको बहुत सारी त्रुटियाँ मिलेंगी, लेकिन नई फ़ाइल डाउन लोड होगी और आपके पास फ़ाइलों को स्थानांतरित करने का ओवरहेड नहीं होगा पहले मिल चुके हैं।

यदि आपके पास दूरस्थ निर्देशिका तक पूर्ण पहुंच है, तो आप रिमोट पर डाउन लोडेड फ़ाइल को हटा सकते हैं, स्थानांतरित कर सकते हैं या उसका नाम बदल सकते हैं, ताकि आपके पास हर बार केवल एक फ़ाइल होगी जो फ़ाइल मास्क से मेल खाती है।

यदि आप इनमें से कुछ भी नहीं कर सकते हैं, तो आपको दो ftpकॉल की आवश्यकता होगी : पहले रिमोट से एक निर्देशिका सूची प्राप्त होगी, जिसे आप फिर अपनी पिछली दूरस्थ सूची से तुलना करेंगे, ताकि आप फिर नई फ़ाइल की पहचान कर सकें और ftpइसे पुनः प्राप्त करने के लिए दूसरी कॉल बनाएं। ऐसा करने के लिए एक बैच फ़ाइल लिखना आसान नहीं होगा, लेकिन यह संभव है - मैं इस तरह की चीजें करता हूं जब मैं वेबकैम फ़ाइलों को संसाधित कर रहा हूं।


1

यदि आप अपना पासवर्ड और उपयोगकर्ता नाम स्क्रिप्ट में (सादे पाठ में!) रखने के लिए तैयार हैं, तो आपको उन्हें कमांड लाइन पर उपयोग करने में कोई आपत्ति नहीं होनी चाहिए।

यदि आप उन्हें डाउनलोड करने के बाद पुरानी फ़ाइलों की स्थानीय प्रतियां रखते हैं, और उन्हें, या उनके टाइमस्टैम्प को नहीं बदलते हैं, तो आप विंडोज के लिए wget का उपयोग करके पूरे बैच फ़ाइल विचार को समाप्त कर सकते हैं , और --timestampingविकल्प को शामिल कर सकते हैं । यह दूरस्थ फ़ाइलों के साथ स्थानीय फ़ाइलों के आकार और टाइमस्टैम्प की तुलना करेगा, केवल दूरस्थ फ़ाइलों को डाउनलोड करने पर जब कोई अलग होता है, या स्थानीय फ़ाइल मौजूद नहीं होती है। एक अतिरिक्त लाभ के रूप में, यदि आप पूर्व अद्यतन से चूक गए हैं, तो यह सभी नई फ़ाइलों को डाउनलोड करेगा, न कि सबसे नए को।

आपकी कमांड लाइन कुछ इस तरह दिखाई देगी:

`wget --ftp-user=<user> --ftp-password=<password> --timestamping ftp://example.com/Events/_PPV_Barker/Barker*_480i.ts`

बेशक, यह मानता है कि आपके पास उचित स्थापित करने के लिए प्रिव्यूज़ हैं, और यह कि आप पहले की प्रतियाँ स्थानीय स्तर पर रखते हैं।


मुझे नहीं पता कि जब मैं आपका जवाब पढ़ता हूं तो मैं winscpइसके बजाय पढ़ता हूं wget...
7

@ हस्तूर यह एक दशक हो गया है जब से मैंने उपयोग किया है winscp। कहा, IIRC, यह एक सुविधा है कि बस काम कर सकता है, एक बैच फ़ाइल लिखने के बजाय। चूंकि ओपी ने windowsटैग सूचीबद्ध किया था , इसलिए यह केवल एक विकल्प हो सकता है। और winscpसुरक्षित एफ़टीपी को संभालने में सक्षम है। आप ओपी के लिए एक और विकल्प पर हिट कर सकते हैं।
जिप्सी स्पेलवेवर

इसके लिए बहुत सारे कार्यक्रम उपयुक्त हैं, फिर भी मैंने अपने उत्तर में उस भाग के बारे में नहीं लिखा है, wgetअगर मैंने कमांड का नाम आपके नाम पर नहीं फैलाया है ... BTW यदि आप "उस रास्ते को उद्धृत करते हैं जो मुझे लगता है कि यह bashबिना किसी प्रयोग के प्रयोग करने योग्य है अंतिम विस्तार का मुद्दा ...
हस्त्तूर

0

निम्न का उपयोग करके देखें:

mget

आदेश। मैंने इसे देखा, और यह कहता है कि कई फाइलें प्राप्त करें।


0

अन्य कार्यक्रम / तरीके

का उपयोग करना ftpसुरक्षित नहीं है।
एफ़टीपी के सुरक्षित संस्करण का नाम है ftps, एफ़टीपी सुरक्षितftpयदि आप कर सकते हैं, तो इसके बजाय इसका उपयोग करने का प्रयास करें ।

अपनी स्क्रिप्ट्स करने के लिए हमेशा एक अच्छा व्यायाम है, लेकिन जब वे मौजूद हों तो उस उद्देश्य के लिए बनाए गए टूल का उपयोग करना बेहतर होता है। विकल्प के रूप में अधिक आरामदायक आप उपयोग कर सकते हैं wget(नीचे देखें) जिसे दूरस्थ रूप से स्थापित किसी अन्य सर्वर की आवश्यकता नहीं होगी।

चूंकि आपके पास दूरस्थ कंप्यूटर तक पहुंच है अगर यह स्थापित है तो आप भी उपयोग कर सकते हैं rsync
यदि यह ssh-key [ 4 ] से लाभ उठाने scp -pया उपयोग करने का प्रयास करने से चूक जाता है । sftp

यदि आप के साथ रहना चाहते हैं ftp, तो उस mgetविकल्प का उपयोग करें जो निर्देशिका से सभी फ़ाइलों को नेत्रहीन रूप से कॉपी करेगा, लेकिन binaryकमांड के साथ फाइल ट्रांसफर के मोड को बाइनरी में अग्रिम रूप से सेट करें ।


wget

wget - गैर-इंटरैक्टिव नेटवर्क डाउनलोडर [ 1 , 2 ] । आप उपयोग कर सकते हैं:

wget -S -N "ftp://YourSite/Events/_PPV_Barker/Barker*_480i.ts" 

इसका विकल्प -Nटाइमस्टैम्प रखना और स्थानीय लोगों की तुलना में केवल नई फाइलें डाउनलोड करना है। लिनक्स के तहत शेल विस्तार से बचने के लिए
उद्धरण की "आवश्यकता हो सकती है।
यह विंडोज़ के तहत भी काम करता है (बेशक कार्यक्रम के विंडोज़ संस्करण के साथ)।


आपके मामले में एक और पूरी कमांडलाइन होनी चाहिए (और केवल एक लाइन में):

wget -user=USERNAME -password=PASSWORD 
     -N "ftp://YourSite/Events/_PPV_Barker/Barker*_480i.ts" 

बेशक अपने कमांडलाइन या स्क्रिप्ट में पासवर्ड लिखने से बचने के लिए यह अधिक बुद्धिमान है ... आप --ask-passwordइसके बजाय स्व-व्याख्या विकल्प का उपयोग कर सकते हैं ।

लिनक्स के तहत एक और अधिक अच्छा समाधान नाम की फ़ाइल में आवश्यक जानकारी डालना है .wgetrc। विंडोज़ डॉक्यूमेंटेशन में समतुल्य नाम ढूंढना आसान होना चाहिए

$ cat ~/.wgetrc
ftp_user=UsernameOnTheRemoteFTP
ftp_password=PasswordOnTheRemoteFTP
http_user=UsernameOnTheRemoteHTTP
http_password=PasswordOnTheRemoteHTTP

आप इससे wget --helpया इससे पढ़ सकते हैं man wget:

-N, --timestamping फ़ाइलों को फिर से प्राप्त न करें जब तक कि स्थानीय
-S की तुलना में नया न हो , - उपयोगकर्ता की प्रतिक्रिया प्रिंट सर्वर प्रतिक्रिया।

--user = user
--password = पासवर्ड
यूज़रनेम और पासवर्ड पासवर्ड को FTP और HTTP फ़ाइल पुनर्प्राप्ति दोनों के लिए निर्दिष्ट करें। इन मापदंडों को एफ़टीपी कनेक्शन के लिए --ftp-user और --ftp-password विकल्प और HTTP कनेक्शन के लिए -http-user और -http-password विकल्पों का उपयोग करके ओवरराइड किया जा सकता है।


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