Saya mencoba menggunakan robocopy di dalam powershell untuk mencerminkan beberapa direktori di mesin rumah saya. Ini skrip saya:
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"
}
Script mengambil file csv dengan daftar direktori sumber dan tujuan. Ketika saya menjalankan skrip saya mendapatkan kesalahan ini:
-------------------------------------------------------------------------------
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 !
Adakah yang harus saya lakukan untuk memperbaikinya?
Terima kasih, Mark.
powershell
robocopy
Mark Allison
sumber
sumber
Mempopulasikan string ke dalam parameter untuk perintah eksternal dari dalam Powershell membutuhkan beberapa lompatan hoop jika Anda ingin dapat menggunakan ekspansi variabel dan juga memiliki baris perintah yang dihasilkan dengan benar memahami parameter mana yang ingin Anda pisahkan dan mana yang tidak. Dalam contoh Anda, Anda mengirim seluruh string sebagai parameter pertama dan Robocopy memberi tahu Anda bahwa itu tidak dapat menemukan string panjang itu sebagai direktori sumber. Anda ingin seluruh string Sumber diperlakukan sebagai satu param (termasuk spasi yang mungkin ada di sana), demikian juga untuk Tujuan tetapi opsi $ what dan $ Anda akan gagal karena keduanya akan dikirimkan ke Robocopy sebagai parameter tunggal yang tidak dapat diurai.
Ada beberapa cara untuk melakukan ini dengan benar, tetapi potongan berikut didasarkan pada cara Anda tampaknya ingin keluar parameter Anda dan bekerja untuk contoh direktori tunggal yang saya gunakan.
sumber
-match
dan-replace
juga menyaring / memproyeksikan cmdlet untuk bekerja dengan itu. Ini umumnya dirancang dengan sangat baik dalam hal itu (sebagian besar*-Object
perintah bersifat ortogonal dan semuanya dapat diterapkan ke objek apa pun).Hapus kutipan dari baris robocopy?
yaitu
sumber
Saya memiliki masalah yang sama. Seluruh baris perintah ditafsirkan sebagai argumen pertama.
Tidak ada yang disebutkan di atas yang berfungsi termasuk:
Meninggalkan tanda kutip tidak berfungsi ketika ada ruang di jalur:
Setelah mencoba trik-trik di http://edgylogic.com/blog/powershell-and-external-commands-done-right/ , akhirnya saya mengerti.
Mungkin saya harus terjebak dengan file bat. :)
sumber
Saya telah menemukan bahwa cara terbaik untuk mengeksekusi perintah asli adalah dengan menggunakan perintah & untuk mengeksekusi daftar string. Juga jika Anda ingin output konsol dimasukkan dalam transkrip powershell, Anda perlu menyalurkan output ke host. Berikut adalah contoh memanggil 7Zip dengan beberapa parameter yang diambil dari 7-Zip ke Amazon S3 Powershell Script yang saya tulis:
Pada dasarnya untuk kasus Anda, saya akan mencoba sesuatu seperti ini (mungkin perlu memecahkan parameter $ what dan $ options secara individual):
sumber
@
jika Anda menggunakan powershell v3 untuk membagi daftar yang dipisahkan koma menjadi tumpukan argumenIni akan menginterpolasi semua variabel, lalu memanggil string yang dihasilkan. Cara Anda memilikinya sekarang, sepertinya robocopy sedang dijalankan dengan tanda kutip di sekitar semua opsi, yaitu, robocopy "c: \ src c: \ dst blah meh". Ini ditafsirkan sebagai parameter tunggal.
sumber
Ini bekerja untuk saya dan memungkinkan input dinamis dari lokasi file log. simbol & hanya memberi tahu PowerShell bahwa teks adalah baris kode yang ingin saya jalankan.
sumber
Menambahkan 2 sen saya ke ini karena dapat membantu seseorang ... Kode di bawah ini hilang bagian "loop" di mana saya membaca csv untuk mendapatkan file untuk disalin
sumber