WinSCP komutlarının PowerShell'de senkronize çalışmasını sağlayın


1

Bir WebDAV konumuna karşı bir dizin senkronizasyonu yazmak için WinSCP kullanmaya çalışıyorum. PowerShell'den böyle çalıştırıyorum:

.\WinSCP.exe -log=.\winscp.log -command "open davs://username:password@www.example.com/" "synchronize remote .\test-files /path/to/webdav/test-files" "exit"

Bu iyi çalışıyor. Dosyalar senkronize edilir. WebDAV dizinini sildim ve dosyaların orada oluşturduğunu görmek için yeniden çalıştırın.

Sorun, WinSCP'nin çıkması. önce senkronizasyon tamamlandı. Bunu, tamamlandıktan sonra geçerli saati kontrol ederek ve günlük dosyasındaki son zaman damgasını karşılaştırarak görebilirsiniz.

İşte sorunu gösteren bir PowerShell komutu:

& {
.\WinSCP.exe -log=.\winscp.log -command "open davs://username:password@www.example.com/" "synchronize remote .\test-files /path/to/webdav/test-files" "exit"
Get-Date
Write-Host 'Exit code:' $LASTEXITCODE
Start-Sleep -Seconds 30
Get-Content -Tail 6 .\WinSCP.log
}

Çıktı:

Tuesday, April 17, 2018 20:41:52
Exit code: 0
. 2018-04-17 20:42:15.025 Copying finished: Transferred: 177, Elapsed: 0:00:20, CPS: 9/s
> 2018-04-17 20:42:15.025 Script: exit
. 2018-04-17 20:42:15.025 Script: Exit code: 0
. 2018-04-17 20:42:15.025 sess: Destroying session.
. 2018-04-17 20:42:15.025 sess: Closing connection.
. 2018-04-17 20:42:15.025 sess: Connection closed.

Gördüğünüz gibi, WinSCP hala komuttan çıktıktan 20 saniye sonra günlüğü yazıyordu. Bu pek mantıklı değil. WinSCP komutun tamamlanmadan önce çalışıp çalışmadığını nasıl belirleyebilir? WinSCP'yi durdurabilir ve komutun çıkmadan önce veya başarı veya başarısızlık bildirmeden önce bitmesini bekleyebilirim?

Yanıtlar:


1

PowerShell, bir sonraki komuta geçmeden önce GUI uygulamalarının tamamlanmasını beklemez.

Bunu çözmek için boru hattını kullanabilirsiniz. PowerShell'e bir sonraki başlamadan önce her komutun bitmesini beklemesini nasıl söylerim?

.\WinSCP.exe ... | Out-Null

Daha kolay olsa da kullanmak WinSCP komut dosyası arayüzü, winscp.com, yerine. Bu eşdeğer bir konsol winscp.exe


İlginç olmasına rağmen komut satırı sözdiziminiz üretmiyor. winscp.log her durumda benim için günlük dosyası. PowerShell, komut satırını ne zaman bozmuş görünüyor - anahtarlar için kullanılır. İle /, işe yarıyor:

.\WinSCP.com /log=.\winscp.log /command "open davs://username:password@www.example.com/" "synchronize remote .\test-files /path/to/webdav/test-files" "exit"

Bunu Komut İstemi'nde yeniden üretebileceğime inanıyorum. Ben sadece zaman damgasını tükürme ve dosyayı okuma rahatlığı için PowerShell'i seçtim. (Aynı zamanda, tüm komut dizisini bir kerede uykuya daldırmak daha kolay hale getirdi.) Ama şu anda aynı makinede olmadığım için yarın tekrar test etmek zorunda kalacağım.
jpmc26

GUI uygulamasını Windows komut satırından çalıştırdığınızda ( cmd.exe ), gerçekten de istemi engellemez. Ancak .bat dosyasından çalıştırıldığında engeller. Tekrar kullanmak winscp.com Bunu çözmek için.
Martin Prikryl

Teşekkürler. Neyin olduğundan emin değilim. - vs. / sorun. Doktorların çoğunlukla dediklerini biliyorum /, ama genellikle denerim - tüm çalıştırılabilir çağrılarımda ve diğer amaçlarla (dizin ayırıcılar gibi) eğik çizgilerin kullanılması nedeniyle çalıştığında tercih ederim. Her ikisine de destek vermek nadir değildir. En son sürümü kullanıyor musunuz (5.13.1 (Build 8265))?
jpmc26

WinSCP ile ilgili değil. WinSCP ile mutlu -. Ancak tam PowerShell betiğinizi çalıştırırsam, Görev Yöneticisi'nde PowerShell’in aralarında boşluk bıraktığını görebilirim. -log= ve .\winscp.log. i.stack.imgur.com/s1t30.png Ne çalışmıyor. WinSCP'nin dikkate almasını sağlar .\winscp.log bağlanılacak bir ana bilgisayar adı olmak, hataya neden olan şey (ancak komut dosyası yine de çalıştırılır ancak günlüğe kaydetme gerçekleşmez). Değiştirirsem - ile /, boşluk eklenmedi.
Martin Prikryl

Belki PowerShell sürüm farkı? Bunu düzeltebilecek başka bir şey, PowerShell'in komutun işlenmesini en aza indirgemek için tüm tartışmayı alıntı yapmaktır. Eğer bu işe yararsa, soruyu güncelleyebilirim.
jpmc26
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.