1 डायरेक्टरी तक सभी फाइलों को स्थानांतरित करने के लिए डॉस बैच का उपयोग करें


4

मैंने Win7 में राइट-क्लिक मेनू के माध्यम से निष्पादित करने के लिए एक बैच फ़ाइल बनाई है। जब मैं किसी फ़ोल्डर पर राइट-क्लिक करता हूं, तो मैं चाहता हूं कि बैच फ़ाइल को 1 डायरेक्टरी तक सभी फ़ाइलों (फ़ोल्डरों को छोड़कर) को स्थानांतरित किया जाए। मेरे पास अभी तक यह है:

PUSHHD %1
MOVE "%1\*.*"  ..\

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

तो मेरा बैच एक फ़ोल्डर पर काम करता है जिसका शीर्षक है PULLTEST लेकिन शीर्षक वाले फोल्डर पर नहीं PULL TEST

फिर, मुझे फ़ोल्डर्स, बस फ़ाइलों को स्थानांतरित करने की आवश्यकता नहीं है। और मैं चाहूंगा कि यह किसी भी ड्राइव पर किसी भी डायरेक्टरी में काम करे। कोई विशिष्ट निर्देशिका नहीं होगी जिसमें मैं काम करूंगा। यह यादृच्छिक होगा।


नीचे दी गई रजिस्ट्री फ़ाइल है जो मुझे संदर्भ के लिए आवश्यक है।

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Directory\shell\PullFiles]
@="PullFilesUP"

[HKEY_CLASSES_ROOT\Directory\shell\PullFiles\command]
@="\"C:\\Program Files\\MyBatchs\\PullFiles.bat\" \"%1\""

हर बार जब कोई "कमांड" के रूप में विंडोज कमांड लाइन इंटरफेस के बारे में बात करता है, तो एक बिल्ली का बच्चा मर जाता है ...
a CVn

जवाबों:


2

बैच इस लाइनर के रूप में सरल हो सकता है:

@move "%~1\*" "%~1\.."

टिल्ड किसी भी संलग्न उद्धरण को हटाता है जो पहले से ही तर्क मूल्य में मौजूद हो सकता है। उद्धरण का अतिरिक्त सेट आपकी समस्या का स्रोत था।

संपादित करें - आप यह नहीं कहते कि आप क्या करना चाहते हैं यदि उसी नाम वाली फ़ाइल पहले से ही मूल निर्देशिका में मौजूद है। चूंकि MOVE कमांड एक बैच फ़ाइल में है, इसलिए डिफ़ॉल्ट मूल फ़ाइल में फ़ाइल को स्वचालित रूप से अधिलेखित करने के लिए है। यदि आप चाहते हैं कि स्क्रिप्ट निर्देश के लिए संकेत दे, आपको ओवरराइट को रोकने का अवसर दे रही है, तो आपको इसकी आवश्यकता है /-Y विकल्प।

@move /-y "%~1\*" "%~1\.."

क्या यह भी फ़ोल्डर्स को स्थानांतरित नहीं करता है? all files (excluding folders)। लेकिन फिर भी, ओपी संस्करण ( *.* ) भी ऐसा होने से नहीं रोकता है क्योंकि फ़ोल्डर नामों में डॉट्स हो सकते हैं
nixda

1
अगर स्पष्ट रूप से सूचीबद्ध किया गया है तो @nixda - MOVE केवल फ़ोल्डर ले जाएगा। यदि वाइल्डकार्ड का उपयोग किया जाता है तो यह कभी भी फ़ोल्डर को स्थानांतरित नहीं करेगा। इसके अलावा, *.* एक्सटेंशन (बिना डॉट्स) वाली फ़ाइलों सहित किसी भी फ़ाइल से मेल खाता है।
dbenham

आह, जानकर अच्छा लगा
nixda

1

आपने जादू कर दिया pushd गलत आदेश, आपके पास दो हैं h

और आपको निकालना है %1 से move आदेश। यदि निर्देशिका में स्थान हैं, move आज्ञा टूट जाती है।

मान लें कि आपके बैच का नाम है MoveFiles.bat। इसे इस तरह कहा जाता है:

MoveFiles.bat "C:\Test\With Spaces"

बैच के अंदर पैरामीटर प्रतिस्थापन के बाद, यह इस तरह दिखता है:

PUSHD "C:\Test\With Spaces"
MOVE ""C:\Test\With Spaces"*.*" ..\

नेस्टेड कोट्स के कारण दूसरी कमांड में सिंटैक्स त्रुटि होती है।


बैच का यह संस्करण मेरे लिए काम करता है:

PUSHD %1
MOVE *.* ..\

1
+1 नेस्टेड उद्धरण एक सिंटैक्स त्रुटि नहीं है, लेकिन यह समस्या का स्रोत है। उदाहरण के लिए, का उपयोग कर उद्धरण का एक अतिरिक्त सेट ""%1\*.*"" काम करेगा, लेकिन यह अनुशंसित नहीं है।
dbenham

@ दीनभम ज़रूर! उद्धरण गलत तरीके से नेस्टेड थे :)
Alexey Ivanov

-1

रिक्त स्थान के कारण उस त्रुटि को फेंकने का कारण है। pushd रिक्त स्थान के साथ काम करता है, लेकिन move ऐसा नहीं करता। अपना दूसरा तर्क संलग्न करने का प्रयास करें, ..\, उद्धरण के साथ:

PUSHD %1
MOVE "%1*.*" "..\"

1
चारों ओर उद्धरण जोड़ना ..\ यहाँ मदद नहीं करेगा क्योंकि त्रुटि पहले पैरामीटर में दोहरे उद्धरण चिह्नों के कारण होती है move इसलिये %1 पहले से ही उद्धरण है।
Alexey Ivanov
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.