iT邦幫忙

0

Xcopy指令複製資料至桌面

最近要寫Xcopy指令,讓分店人員透過執行bat檔,從FTP複製資料至分店筆電的桌面上。
其中,遇到的問題是分店有些是WIN XP,有些則是WIN 7,以致桌面的資料夾名稱有些是"桌面",有些則是"Desktop",但由於分店人員較無法判斷作業系統為何?所以我能想得到的就是直接於一個bat檔中直接寫上兩行。

XCOPY 來源路徑 %USERPROFILE%\桌面 /E /I
XCOPY 來源路徑 %USERPROFILE%\Desktop /E /I

但是這樣就會變成WIN 7的桌面名稱是Desktop,卻會新增桌面資料夾,然後進行複製。
反之,WIN XP則會新增Desktop資料夾,然後進行複製。
想請教位前輩,有無辦法能避免上述情形,因為我要的只是備份資料到真的桌面上就好,感恩。

(P.S)為何不直接複製於C或D槽,C槽是因為分店都僅有user權限,D槽則是因為前人都沒分割,到我接手處理的時候才有割。

看更多先前的討論...收起先前的討論...
加一個if else就行啦
蟹老闆 iT邦大師 1 級 ‧ 2016-10-10 13:23:50 檢舉
ver|findstr "6.1">nul&&Echo 這是XP||Echo 不是XP
抱歉,小弟愚昧,是否可麻煩前輩們再說的深入點,感恩。
蟹老闆 iT邦大師 1 級 ‧ 2016-10-10 17:12:56 檢舉
更正ver|findstr "6.1">nul&&Echo 不是XP||Echo 這是XP
方法1:
假設XP路經為桌面
ver|findstr "5.1">nul&&XCOPY 來源路徑 %USERPROFILE%\桌面 /E /I||XCOPY 來源路徑 %USERPROFILE%\Desktop /E /I

方法2:
Echo off
Set Reg="HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /V desktop
For /f "Tokens=3 Skip=2" %%R in ('Reg Query %Reg%') Do XCOPY 來源路徑 "%%R" /E /I
Pause
方法2在某些狀況下路徑會被截斷,不建議使用
蟹老闆 iT邦大師 1 級 ‧ 2016-10-10 17:21:43 檢舉
以上二種各有優缺
第一種當路徑不為"桌面"時會有非預期的結果發生(印象中XP應也有以Desktop為名的桌面資料夾),另外桌面位置換了也會有問題.
第二種方法能避免第一個方法的問題,但截斷的問題目前沒有好辨法(似乎與安裝的版本有關)
感恩蟹老闆的詳細解說,剛已進行測試方法一只要是XP,就 " XCOPY 來源路徑 %USERPROFILE%\桌面 ",否則其它的作業系統就執行 " XCOPY 來源路徑 %USERPROFILE%\Desktop /E /I "。

想請教您,是不是XP是用ver|findstr "5.1">nul這段去判斷嗎?另外那會區分XP的版本嗎?感恩蟹老闆。
@echo off

If Exist %SystemDrive%\Users (
echo This is Win7
) else (
This is XP
)

Pause

剛剛幫你寫的方法,用判斷是否C底下有Users資料夾 如果有的話就是Win7 沒有則是WinXP,試試看吧!
蟹老闆 iT邦大師 1 級 ‧ 2016-10-11 10:24:53 檢舉
ver|findstr "5.1">nul
的解釋是先以ver指令輸出系統的版本然後用>將結果導給findstr去尋找OS版本號,之後再將結果以>導給nul(無底洞),用意是不顯示搜尋後的結果
手邊有的版本號如下,供參考
4.9=Windwos ME
5.1=Windwos XP
5.2=Windwos 2003
6.0=Windwos Vista or Windwos 2008
6.1=Windwos Windows7 or Windwos 2008R2
6.2=Windows 8 or Windwos 2012
6.3=Windows 8.1 or Windwos 2012R2
6.4=Windows 10
蟹老闆 iT邦大師 1 級 ‧ 2016-10-11 10:27:31 檢舉
因為您只有XP跟Win7,所以只用上述方式就可以了,不用判斷其它的版本
感恩蟹老闆,非常清楚。因為公司最新購買的筆電系統還有Windows 10 與 Windows 8,我印象中這兩個系統的桌面資料夾好像也叫做"桌面",若還要把這兩個加入,是否可寫成ver|findstr "6.2","6.3","6.4">nul,還是我直接寫成ver|findstr "6.1">nul&&Echo 是WIN7||Echo 不是WIN7就好。

其實,一直在思考著要不要乾脆不要判斷,反正沒有資料夾的就一樣新增後複製,省的到時有的沒複製到,又要連線分店。
蟹老闆 iT邦大師 1 級 ‧ 2016-10-11 18:13:53 檢舉
方法3:
@Echo Off
Echo Set WshShell = WScript.CreateObject("WScript.Shell") >tmp.vbs
Echo Wscript.Echo WshShell.SpecialFolders("Desktop") >>tmp.vbs
for /f %%i in ('cscript /NOLOGO tmp.vbs') Do XCOPY 來源路徑 "%%i" /E /I
Del /q tmp.vbs
pause
可解決1及2的問題

方法4:
要求使用者將批次檔放到桌面後再執行
XCOPY 來源路徑 "%~pd0" /E /I
剛測試了WIN 10,發現此作業系統的桌面資料夾的真正名稱是Desktop,原本是叫做"桌面",但實際執行Bat檔後名稱卻變為Desktop。XP與WIN 8可能就還要測看看了。

另外,試了方法4,遇到實際名稱為Desktop但卻叫作桌面的,似乎無法正常運作。%~pd0是否指桌面。

感恩蟹老闆不吝的提供許多方案。

方案3,小弟愚昧,還在努力研究。
蟹老闆 iT邦大師 1 級 ‧ 2016-10-12 00:14:17 檢舉
方法3是利用vbs取得桌面路徑後回傳給批次檔,利用for 讀出回傳值
蟹老闆 iT邦大師 1 級 ‧ 2016-10-12 00:18:16 檢舉
外,試了方法4,遇到實際名稱為Desktop但卻叫作桌面的,似乎無法正常運作。%~pd0是否指桌面。
應該不會有問題,看看是否忘了加"%~pd0"
或是將錯誤訊息POST來參考也可以
%~pd0 的值是批次檔所在的路徑,會隨著存放的位置不同,內容會有所不同,例如放到D槽則是 d:\
目前程式碼改為方法4,實測後沒問題。
再觀察個幾天看看。

感恩蟹老闆的不吝分享。
最佳解答為蟹老闆。
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

WilliamHuang
iT邦研究生 1 級 ‧ 2016-10-11 14:05:31
【**此則訊息已被站方移除**】
0
morryboy
iT邦新手 1 級 ‧ 2016-10-15 10:35:28

看看行不行

@echo off
SETLOCAL
FOR /F "usebackq" %%f IN (`PowerShell -NoProfile -Command "Write-Host([Environment]::GetFolderPath('Desktop'))"`) DO (
  SET "DESKTOP_FOLDER=%%f"
  )
XCOPY 來源路徑 %DESKTOP_FOLDER% 
morryboy iT邦新手 1 級 ‧ 2016-10-15 10:38:22 檢舉

http://ithelp.ithome.com.tw/upload/images/20161015/20031531YHcTVHsvPU.png

我要發表回答

立即登入回答