কীভাবে রবোকপি পাওয়ার পাওয়ারে চলবে?


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
সুতরাং আপনি কেবল / লগটি এড়িয়ে গেছেন এবং এটি কাজ করেছে :-) গোগা হ'ল লগফাইলে এর আগে উপস্থিত না থাকলে আপনি পিএস দিয়ে রবোকপি কল করে অদ্ভুত ত্রুটি পান।
আইসনিভাদ

6
আমি জানি এটি একটি পুরানো পোস্ট, তবে আমি মনে করি যে এটির পরিবর্তনশীল হিসাবে থাকা এটি স্ক্রিপ্টের ভবিষ্যতের পাঠকদের জন্য একটি সংকেত যা এইগুলি স্ক্রিপ্টের কনফিগার করার অংশ হিসাবে বোঝানো হয়েছিল। এটি কাজ করার কারণটি হ'ল মূল টাইপটি ঠিক করতে happens কী।
অক্টোপাস

2
কিছু পরিবর্তন না হলেও, ভেরিয়েবল এনক্যাপসুলেশন কোনও স্ক্রিপ্টকে কম সংশ্লেষিত করতে সহায়তা করতে পারে। এবং যদি এটির দেখা দেয় তবে পরে আমাকে সেই পরিবর্তনশীলটি আবার উল্লেখ করতে হবে, এটি স্ক্রিপ্টটিকে আরও গতিশীল করে তোলে
কলব ক্যানিয়ন

20

পাওয়ারশেলের মধ্যে থেকে বাহ্যিক কমান্ডগুলির জন্য প্যারামিটারগুলিতে স্ট্রিংগুলি পপুলেটিং করার জন্য কিছু পরিবর্তন করতে হবে যদি আপনি ভেরিয়েবল সম্প্রসারণ ব্যবহার করতে সক্ষম হন এবং ফলস্বরূপ কমান্ড লাইনটি সঠিকভাবে বুঝতে পারে যে আপনি কোন প্যারামিটারগুলি পৃথক করতে চান এবং কোনটি নয়। আপনার উদাহরণে আপনি পুরো পংক্তিটিকে প্রথম প্যারামিটার হিসাবে প্রেরণ করছেন এবং রোবকপি আপনাকে বলছে যে এটি দীর্ঘ ডিরেক্টরিটিকে উত্স ডিরেক্টরি হিসাবে খুঁজে পাচ্ছে না। আপনি চান পুরো উত্সের স্ট্রিংকে একইভাবে গন্তব্যস্থলের জন্য (সেখানে থাকা জায়গাগুলি সহ) এক পরম হিসাবে বিবেচিত হওয়া উচিত তবে আপনার $ কি এবং $ বিকল্পগুলি ব্যর্থ হবে কারণ সেগুলি উভয়ই একক প্যারামিটার হিসাবে রোবকোপিতে সরবরাহ করা হবে যা হতে পারে না পার্স।

এই কাজটি করার কয়েকটি উপায় রয়েছে তবে নীচের স্নিপেটটি আপনার পরামিতিগুলি ভেঙে ফেলতে চাইছেন এবং যে একক ডিরেক্টরি উদাহরণটি আমি ব্যবহার করেছি তার জন্য কাজ করে based

$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: "/ কপিওয়াল / বি / এসইসি / এমআইআর"
মার্ক এ্যালিসন

আমি যখন উপরের স্টাব কোডটি চালাই (উপরে থেকে অনুলিপি করা হয়) এটি প্রত্যাশার মতো ঠিক কাজ করে - বিশেষত সমস্ত বিকল্প - আইটেমগুলি পৃথক পরামিতি হিসাবে স্বীকৃত। আপনি যদি উপরের স্টাবটি চালান তবে (বিদ্যমান উত্স ফোল্ডারের সাথে) কী কাজ করে? যদি তা হয় তবে আপনার নিজের পরিবর্তিত কোডে উদ্ধৃতিগুলি \ পলায়নের দ্বিগুণ চেক করুন। অবৈধ প্যারামিটার # 3 ইঙ্গিত দেয় যে আপনার সংস্করণ still কী এখনও একটি একক স্ট্রিং আপনি যে কোডটি চালাচ্ছেন তাতে আলাদা পরামিতিগুলির অ্যারে নয় not
হেলভিক

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 কপিল \ বি \ এসইসি \ \ মির \ আর: 0 \ ডাব্লু: 0 \ এনএফএল \ এনডিএল \ লোগ: মায়লোগফিল.টিএক্সটি \" হিসাবে দেখিয়েছিল উদ্ধৃতি মনোযোগ।
ব্রায়ান

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-extern-commands-done-right/ এ কৌশলগুলি চেষ্টা করার পরে , অবশেষে আমি তা পেয়েছি।

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

সম্ভবত আমার ব্যাটের ফাইলগুলি আটকে রাখা উচিত ছিল। :)


আপনার এডিগ্লোগিক লিঙ্কটি কি স্লাই.github.io/posts/… এ চলে গেছে ?
হেনরিক স্টাউন পলসন

1

আমি খুঁজে পেয়েছি যে একটি নেটিভ কমান্ড কার্যকর করার সর্বোত্তম উপায় হল স্ট্রিংগুলির একটি তালিকা চালানোর জন্য & কমান্ড ব্যবহার করা। এছাড়াও আপনি যদি কনসোল আউটপুটটিকে পাওয়ারশেল ট্রান্সক্রিপ্টে অন্তর্ভুক্ত করতে চান তবে আপনাকে আউট-হোস্টে আউটপুটটি পাইপ করতে হবে। আমি লিখেছিলাম যে 7-জিপ থেকে অ্যামাজন এস 3 পাওয়ারশেল স্ক্রিপ্টে একাধিক পরামিতি নিয়ে 7 জিপ কল করার উদাহরণ এখানে রয়েছে :

$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"

এর সাথে সমস্যাটি হ'ল আপনি "$ হোয়াট" এবং "$ অপশনগুলি" রবকোপিকে আলাদা পদের একটি তালিকা না করে একক পরামিতি হিসাবে প্রেরণ করবেন এবং তার নমুনা কোড দেওয়ার পরে সেগুলি ভেঙে ফেলতে হবে, এ সম্পর্কে কোনও সম্ভাবনা নেই এটা।
হেলভিক

আপনি @যদি স্পষ্ট অপারেটরটি ব্যবহার করতে পারেন তবে যদি আপনি কমা দ্বারা বিচ্ছিন্ন তালিকাটি আর্গুমেন্টের স্ট্যাকে বিভক্ত করতে পাওয়ারশেল ভি 3 ব্যবহার করছেন
জাসেজ

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

এটি সমস্ত ভেরিয়েবলকে বিভক্ত করবে, তারপরে ফলাফলটি স্ট্রিংকে কল করবে। আপনার এখন যেভাবে রয়েছে, দেখে মনে হচ্ছে রোবোকপিটি সমস্ত বিকল্পের অর্থাত অর্থাত, রোবোকপি "c: \ src c: \ dst blah meh" এর সাথে উদ্ধৃতি সহ ডাকা হচ্ছে। এটি একক প্যারামিটার হিসাবে ব্যাখ্যা করা হয়।


0

এটি আমার পক্ষে কাজ করেছে এবং লগ ফাইলের অবস্থানের গতিশীল ইনপুটটির অনুমতি দেয়। & চিহ্নটি কেবল পাওয়ারশেলকে জানিয়েছে যে পাঠ্যটি কোডটি চালানোর জন্য একটি লাইন।

    $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 ..  

}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.