कैसे शक्तियां में रोबोकॉपी चल रही है?


24

मैं अपने होम मशीनों पर कुछ निर्देशिकाओं को मिरर करने के लिए पॉवरशेल के अंदर रोबोकॉपी का उपयोग करने की कोशिश कर रहा हूं। यहाँ मेरी स्क्रिप्ट है:

param ($configFile)

$config = Import-Csv $configFile
$what = "/COPYALL /B /SEC/ /MIR"
$options = "/R:0 /W:0 /NFL /NDL"
$logDir = "C:\Backup\"

foreach ($line in $config)
{
 $source = $($line.SourceFolder)
 $dest = $($line.DestFolder)
 $logfile =  $logDIr 
 $logfile += Split-Path $dest -Leaf
 $logfile += ".log"

 robocopy "$source $dest $what $options /LOG:MyLogfile.txt"
}

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

-------------------------------------------------------------------------------
   ROBOCOPY     ::     Robust File Copy for Windows                              
-------------------------------------------------------------------------------

  Started : Sat Apr 03 21:26:57 2010

   Source : P:\ C:\Backup\Photos \COPYALL \B \SEC\ \MIR \R:0 \W:0 \NFL \NDL \LOG:MyLogfile.txt\
     Dest - 

    Files : *.*

  Options : *.* /COPY:DAT /R:1000000 /W:30 

------------------------------------------------------------------------------

ERROR : No Destination Directory Specified.

       Simple Usage :: ROBOCOPY source destination /MIR

             source :: Source Directory (drive:\path or \\server\share\path).
        destination :: Destination Dir  (drive:\path or \\server\share\path).
               /MIR :: Mirror a complete directory tree.

    For more usage information run ROBOCOPY /?


****  /MIR can DELETE files as well as copy them !

किसी भी विचार मुझे ठीक करने के लिए क्या करने की आवश्यकता है?

धन्यवाद, निशान।

जवाबों:


10

यदि चरों के लिए चर $whatऔर $optionsपरिवर्तन नहीं होते हैं, तो वे चर क्यों हैं?

$what = "/COPYALL /B /SEC /MIR" 
$options = "/R:0 /W:0 /NFL /NDL" 

यह मेरे लिए ठीक काम करता है:

robocopy   $source $dest /COPYALL /B /SEC /MIR /R:0 /W:0 /NFL /NDL

अच्छी बात है - इसे सरल रखें। :)
हेल्विक

3
यह भी / सेकंड नहीं / सेकंड महत्वपूर्ण है

1
तो आप बस / लॉग को छोड़ दिया और यह काम किया :-) Gotcha है कि आप अजीब त्रुटियों को PS के साथ Robocopy कहते हैं जब Logfile पहले से मौजूद नहीं है।
इक्निवाड

6
मुझे पता है कि यह एक पुरानी पोस्ट है, लेकिन मुझे लगता है कि यह कहने के लायक है कि ये चर के रूप में स्क्रिप्ट के भविष्य के पाठकों के लिए एक संकेत है कि ये स्क्रिप्ट के विन्यास भागों के लिए थे। इसका कारण यह है कि यह मूल $ $ में टाइपो को ठीक करने के लिए होता है।
ऑक्टोपस

2
यहां तक ​​कि अगर कुछ नहीं बदल रहा है, तो वैरिएबल एनकैप्सुलेशन स्क्रिप्ट को कम जटिल बनाने में मदद कर सकता है। और अगर यह पता चला है कि मुझे उस चर को बाद में फिर से संदर्भित करने की आवश्यकता है, तो यह स्क्रिप्ट को अधिक गतिशील बनाता है
कोलोब कैनोन

20

पॉवर्सशेल के भीतर से बाहरी कमांड्स के लिए पैरामीटर में स्ट्रिंग्स पॉपिंग करने के लिए कुछ हूप जंपिंग की आवश्यकता होती है, यदि आप वेरिएबल एक्सपेंशन का उपयोग करने में सक्षम होना चाहते हैं और परिणामी कमांड लाइन को ठीक से समझते हैं कि आप कौन से पैरामीटर को अलग करना चाहते हैं और जो नहीं करना चाहिए। आपके उदाहरण में आप पूरे स्ट्रिंग को पहले पैरामीटर के रूप में भेज रहे हैं और रोबोकॉपी आपको बता रहा है कि यह उस लंबी स्ट्रिंग को स्रोत निर्देशिका के रूप में नहीं पा सकता है। आप चाहते हैं कि संपूर्ण स्रोत स्ट्रिंग को एक परम के रूप में माना जाए (जिसमें रिक्त स्थान शामिल हो सकते हैं), इसी तरह गंतव्य के लिए लेकिन आपके $ क्या और $ विकल्प विफल होंगे क्योंकि वे दोनों एक ही पैरामीटर के रूप में रोबोकॉपी को वितरित किए जाएंगे जो नहीं हो सकते पार्स।

इस अधिकार को करने के कुछ तरीके हैं लेकिन निम्नलिखित स्निपेट उस तरीके पर आधारित है जिससे आप अपने मापदंडों को तोड़ना चाहते हैं और मैंने जिस एकल निर्देशिका उदाहरण का उपयोग किया है, उसके लिए काम करता है।

$source="C:\temp\source"
$dest="C:\temp\dest"

$what = @("/COPYALL","/B","/SEC","/MIR")
$options = @("/R:0","/W:0","/NFL","/NDL")

$cmdArgs = @("$source","$dest",$what,$options)
robocopy @cmdArgs

उत्तर के लिए धन्यवाद। मैंने आपका कोड आज़मा लिया है, लेकिन मुझे अभी भी निम्न त्रुटि मिली है: त्रुटि: अमान्य पैरामीटर # 3: "/ COPYALL / B / SEC / MIR"
मार्क एलीसन

जब मैं उपरोक्त स्टब कोड (ऊपर से कॉपी किया हुआ) चलाता हूं तो यह बिल्कुल अपेक्षित रूप से काम करता है - विशेष रूप से सभी विकल्प \ अलग-अलग मापदंडों के रूप में पहचाने जाते हैं। यदि आप ऊपर दिए गए स्टब (एक स्रोत फ़ोल्डर के साथ मौजूद हैं) तो क्या यह काम करता है? यदि ऐसा है तो अपने स्वयं के संशोधित कोड में उद्धरणों को दोहराएं। अमान्य पैरामीटर # 3 इंगित करता है कि आपके संस्करण जो अभी भी एक ही स्ट्रिंग है जो आपके द्वारा चलाए जा रहे कोड में अलग-अलग मापदंडों की एक सरणी नहीं है।
हेल्विक

2
+1। यह निश्चित रूप से यहाँ मुद्दा है। मुझे यह अजीब लगता है कि कैसे लोग लगातार पॉवरशेल का उपयोग करने की कोशिश करते हैं जैसे कि यह एक पुराना पाठ-केवल-आधारित शेल ;-)
जॉय

@ जॉय क्या आपने पाठ आधारित लोगों की तुलना में अभ्यास में बेहतर तरीके से काम करने के लिए पॉवरशेल के ऑब्जेक्ट मॉडल को पाया है?
डिडियर ए।

1
@ डिडिएरा: निश्चित रूप से। विशेष रूप से जहां वस्तुएं आपके साथ बातचीत करने वाली चीजों का वर्णन करने के लिए मौजूद होती हैं, जैसे फाइलें, प्रक्रियाएं, सेवाएं आदि, लेकिन यहां तक ​​कि जब आपके पास केवल देशी अनुप्रयोग और स्ट्रिंग आउटपुट होते हैं, तो आप सामान्य स्ट्रिंग ऑपरेटर, जैसे -matchऔर -replaceसाथ ही साथ / cmdlets फ़िल्टरिंग का उपयोग कर सकते हैं। उस के साथ काम करने के लिए। यह आम तौर पर उस संबंध में काफी अच्छी तरह से डिज़ाइन किया गया है (अधिकांश *-Objectकमांड ऑर्थोगोनल हैं और वे सभी किसी भी वस्तु पर लागू किए जा सकते हैं)।
जॉय

3

रोबोकॉपी लाइन से उद्धरण निकालें?

अर्थात

param ($configFile)

$config = Import-Csv $configFile
$what = "/COPYALL /B /SEC/ /MIR"
$options = "/R:0 /W:0 /NFL /NDL"
$logDir = "C:\Backup\"

foreach ($line in $config)
{
 $source = $($line.SourceFolder)
 $dest = $($line.DestFolder)
 $logfile =  $logDIr 
 $logfile += Split-Path $dest -Leaf
 $logfile += ".log"

 robocopy $source $dest $what $options /LOG:MyLogfile.txt
}

नहीं, मैंने पहले कोशिश की थी और यह काम नहीं किया था (इसी तरह की त्रुटियां), इसलिए मैंने इसे बदल दिया जो ऊपर दिखाया गया है। कोई अन्य विचार?
मार्क ऐलिसन

जब आप इसे बिना उद्धरण के चलाते हैं तो आउटपुट क्या है? आपका मूल आउटपुट स्रोत को "P: \ C: \ Backup \ Photos \ COPYALL \ B \ SEC \ \ MIR \ R: 0 \ W: 0 \ NFL \ NDL \ LOG: MyLogfile.txt \" के रूप में दिखाता है। उद्धरणों पर ध्यान दें।
ब्रायन

3

मुझे भी यही समस्या थी। पूरे कमांड लाइन को पहले तर्क के रूप में व्याख्या किया गया था।

ऊपर वर्णित कुछ भी काम नहीं किया गया है:

invoke-expression "robocopy ""$sourceFolder"" ""$destinationFolder"" /MIR"  
invoke-expression "robocopy \`"$sourceFolder\`" \`"$destinationFolder\`" /MIR"  

रास्ते में जगह होने पर उद्धरण छोड़ना काम नहीं करता है:

invoke-expression "robocopy $sourceFolder $destinationFolder /MIR"  

Http://edgylogic.com/blog/powershell-and-external-commands-done-right/ में ट्रिक्स आज़माने के बाद , आखिरकार मुझे मिल गया।

robocopy "\`"$sourceFolder"\`" "\`"$destinationFolder"\`" /MIR

हो सकता है कि मुझे बल्ले की फाइलों से चिपकना चाहिए था। :)


Edgylogic अपने लिंक करने के लिए ले जाया गया है slai.github.io/posts/... ?
हेनरिक स्टॉउन पॉल्सेन

1

मैंने पाया है कि देशी कमांड को निष्पादित करने का सबसे अच्छा तरीका स्ट्रिंग्स की सूची निष्पादित करने के लिए & कमांड का उपयोग करना है। इसके अलावा अगर आप चाहते हैं कि कंसोल आउटपुट को एक पॉवरशेल ट्रांसक्रिप्ट में शामिल किया जाए तो आपको आउटपुट को आउट-होस्ट करने के लिए पाइप करना होगा। यहाँ 7-जिप को 7-जिप से लेकर अमेजन S3 पॉवरशेल स्क्रिप्ट में लिए गए कई मापदंडों के साथ कॉल करने का एक उदाहरण है जो मैंने लिखा था:

$7ZipPath = "C:\Program Files\7-Zip\7z.exe" #Path to 7Zip executable
$FolderPath = "C:\Backup" #Folder to backup (no trailing slash!)
$FolderName = $FolderPath.Substring($FolderPath.LastIndexOf("\")+1) #grab the name of the backup folder
$TimeStamp = [datetime]::Now.ToString("yyyy-MM-dd_HHmm") #Create unique timestamp string
$strFile = [String]::Format("{0}\{1}_{2}.7z", "c:\",$FolderName,$TimeStamp) #Create filename for the zip
#7z options: add, type 7z, Archive filename, Files to add (with wildcard. Change \* to \prefix* or \*.txt to limit files), compression level 9, password, encrypt filenames, Send output to host so it can be logged.
& $7ZipPath "a" "-t7z" "$strFile" "$FolderPath\*" "-mx9" "-r" "-pPASSWORD" "-mhe" | out-host #create archive file
if($LASTEXITCODE -ne 0){ #Detect errors from 7Zip. Note: 7z will crash sometimes if file already exists
    Write-Error "ERROR: 7Zip terminated with exit code $LASTEXITCODE. Script halted."
    exit $LASTEXITCODE
}

मूल रूप से आपके मामले के लिए मैं कुछ इस तरह की कोशिश करूंगा (व्यक्तिगत रूप से $ क्या और $ विकल्प मापदंडों को तोड़ना पड़ सकता है)

$robocopypath = "c:\pathtofolder\robocopy.exe"
& $robocopypath "$source" "$dest" "$what" "$options" "/LOG:MyLogfile.txt"

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

आप स्पैट ऑपरेटर का उपयोग कर सकते हैं @यदि आप एक अल्पविराम से अलग की गई सूची को एक तर्क स्टैक में विभाजित करने के लिए पॉवरशेल v3 का उपयोग कर रहे हैं
Zasz

0
invoke-expression "robocopy $source $dest $what $options /LOG:MyLogfile.txt"

यह सभी चर को प्रक्षेपित करेगा, फिर परिणामी स्ट्रिंग को कॉल करेगा। जिस तरह से आपके पास अभी है, ऐसा लगता है कि रोबोकॉपी को सभी विकल्पों के आसपास उद्धरण के साथ आमंत्रित किया जा रहा है, अर्थात, रोबोकॉपी "c: \ src c: \ dst blah meh"। इसकी व्याख्या एकल पैरामीटर के रूप में की जाती है।


0

यह मेरे लिए काम करता है और लॉग फ़ाइल स्थान के एक गतिशील इनपुट के लिए अनुमति देता है। & सिंबल केवल PowerShell को बताता है कि पाठ कोड की एक पंक्ति है जिसे मैं चलाना चाहता हूं।

    $source = "E:\BackupToRestore\"
    $destination = "E:\RestoreMe\"
    $logfile = "E:\robocopyLogFile.txt"    
    $switches = ("/B", "/MIR", "/XJ", "/FFT", "/R:0", "/LOG:$logfile")
    & robocopy $source $destination $roboCopyString $switches

0

मेरे 2 सेंट को जोड़कर, क्योंकि यह किसी की मदद कर सकता है ... नीचे का कोड "लूप" भाग को याद कर रहा है, जहां मैंने फ़ाइलों को कॉपी करने के लिए एक सीएसवी पढ़ा है

# first we setup an array of possible robocopy status
$RobocopyErrors="NO ERRORS",
            "OKCOPY",
            "XTRA",
            "OKCOPY + XTRA",
            "MISMATCHES",
            "OKCOPY + MISMATCHES",
            "MISMATCHES + XTRA",
            "OKCOPY + MISMATCHES + XTRA",
            "FAIL",
            "OKCOPY + FAIL",
            "FAIL + XTRA",
            "OKCOPY + FAIL + XTRA",
            "FAIL + MISMATCHES& goto end",
            "OKCOPY + FAIL + MISMATCHES",
            "FAIL + MISMATCHES + XTRA",
            "OKCOPY + FAIL + MISMATCHES + XTRA",
            "***FATAL ERROR***"
#setting some variables with the date
$DateLogFile=get-date -format "yyyyddMMhh"

#this commands below one usually goes into a loop
$DateLog=get-date -format "yyyyddMMhhmmss"

#adding options and command arg as described in previous post
$options = @("/R:0","/W:0")
$cmdArgs = @("$Source","$Destination",$File,$options)

#executing Robocopy command
robocopy @cmdArgs

# We capture the lastexitcode of the command and use to confirm if all was good or not

$errorlevel=$LASTEXITCODE
# I output the status to a log file
"$DateLog`t::$($RobocopyErrors[$errorlevel])::`"$file`"`t`"$Source`" -> `"$Destination`"" | out-file "$scriptPath\Logs\$DateLogFile.log" -append
 if ($errorlevel -lt 8) {
    #error below 8 = all is good

}
else {
    # something bad happened ..  

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