การนำทางไปยังเดสก์ท็อป

ฉันมีปัญหาในการทำให้ไฟล์ bat ทำงานได้อย่างถูกต้อง ฉันใช้งานฮาร์ดไดรฟ์สองตัวบนคอมพิวเตอร์ของฉัน และเดสก์ท็อปของฉันอยู่ในไดรฟ์ E: ดังนั้น %Userprofile%\Desktop นำทางฉันไปยังเดสก์ท็อปของฉันบน E: แต่เมื่อใส่ลงในไฟล์ bat ของฉัน มันพยายามสร้างโฟลเดอร์อื่นใน C: Drive ของฉันที่เรียกว่า Desktop สะกดเหมือนกันทุกประการ แต่ฉันจะใช้สิ่งนี้กับคอมพิวเตอร์เครื่องอื่นที่อาจมีหรือไม่มีเดสก์ท็อปอยู่ในไดรฟ์ C: ฉันกำลังคัดลอกไฟล์ไปยังโฟลเดอร์อื่น

xcopy /s "%~dp0\Folder\Folder\Folder\Folder\File.exe" "%USERPROFILE%\Desktop\WorkFiles" /Y

สิ่งนี้จะพยายามสร้างโฟลเดอร์ชื่อเดสก์ท็อปและวาง exe ลงไป ค้างคาวทำงานบน USB ดังนั้น "%~dp0"


person meowmeow    schedule 12.08.2017    source แหล่งที่มา
comment
%USERPROFILE% ชี้ไปที่อะไร?   -  person SomethingDark    schedule 12.08.2017
comment
@meowmeow ฉันแนะนำให้เพิ่มแบ็กสแลชต่อท้ายเส้นทางเป้าหมาย มิฉะนั้นในไดเร็กทอรี WorkFiles ยังไม่มีอยู่ xcopy จะแจ้งเตือนว่าเป้าหมายระบุไฟล์หรือไดเร็กทอรี ตัวเลือก /Y ไม่ได้ป้องกันพร้อมท์นี้   -  person Mofi    schedule 12.08.2017


คำตอบ (1)


คำสั่ง xcopy ของคุณมีแบ็กสแลชต่อท้ายรวมอยู่ใน %~dp0 ดังนั้นจึงมีมากเกินไป แทนที่ด้วย:

xcopy /s /Y "%~dp0Folder\Folder\Folder\Folder\File.exe" "%USERPROFILE%\Desktop\WorkFiles\"

หากคุณย้ายเดสก์ท็อปของคุณจากตำแหน่งปกติ คุณต้องค้นหาตำแหน่งจริงในรีจิสทรี (หรือโฟลเดอร์เชลล์ผู้ใช้ PowerShell/vbscript)
หากไม่ได้ย้ายเดสก์ท็อป ชุดงานนี้จะยังได้รับตำแหน่งที่ถูกต้อง:

Set "Key=HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders"
Set "Val=Desktop"
For /F "Tokens=2*" %%A in (
  'Reg Query "%Key%" /v "%Val%" 2^>Nul ^| Find "%Val%" '
) Do Set "Desktop=%%B"
Echo 'Desktop' location: %Desktop%

วิธีที่ดีกว่าในการประเมินเดสก์ท็อปบนระบบ windows ที่แตกต่างกันคือการใช้เวอร์ชัน eryksuns:

@Echo off
for /f "usebackq delims=" %%a in (
  `powershell -c "[environment]::GetFolderPath('Desktop')"`
) do set "desktop=%%a"
person Community    schedule 12.08.2017
comment
ในทางเทคนิคแล้ว ไม่ควรใช้คีย์รีจิสทรีของ Shell Folders คุณสามารถรับข้อมูลนี้โดยใช้ .NET ผ่าน PowerShell: for /f "usebackq delims=" %%a in (`powershell -c "[environment]::getfolderpath('desktop')"`) do @set "desktop=%%a" - person Eryk Sun; 12.08.2017
comment
@eryksun ฉันเห็นด้วยนั่นเป็นวิธีที่เป็นทางการมากกว่า รหัสของฉันมาจากคำตอบนี้โดยพื้นฐานแล้วประเมินโฟลเดอร์ดาวน์โหลดที่ถูกย้ายตำแหน่งซึ่งดูเหมือนจะไม่มีทางอื่นใด - person ; 12.08.2017
comment
@LotPings ฉันได้แก้ไขเส้นทางโฟลเดอร์เชลล์บางส่วนตั้งแต่ Windows 95 บนเครื่อง Windows ทั้งหมดของฉัน ตามบทความของ Microsoft TechNet เกี่ยวกับ โฟลเดอร์ User Shell และ Shell Folders เวอร์ชันหลังมีอยู่เฉพาะสำหรับความเข้ากันได้ในระดับล่างสำหรับโปรแกรมที่ออกแบบมาสำหรับ Windows NT 4.0 หรือ ก่อนหน้านี้. Windows 2000 และ Windows เวอร์ชันใหม่กว่าทั้งหมดใช้ User Shell Folders และอัปเดต Shell Folders โดยอัตโนมัติไม่ช้าก็เร็วเมื่อมีการแก้ไขค่าสตริงใน User Shell Folders - person Mofi; 12.08.2017
comment
@mofi ใช่เวอร์ชันแรกของฉันในคำตอบที่อ้างอิงรวมโฟลเดอร์เชลล์ผู้ใช้ด้วย แต่ตัวเลือกมากมายดูเหมือนจะช่วยได้มากกว่าความช่วยเหลือ ดูเหมือนว่าการดัดแปลง Powershell ของ Eryksun จะเป็นตัวเลือกที่ดีกว่าสำหรับโฟลเดอร์เชลล์ที่มีอยู่ - person ; 12.08.2017
comment
สิ่งที่น่าสนใจสำหรับฉันก็คือ Shell Folders บนเครื่อง Windows XP ของฉันมีสตริง Administrative Tools และ CD Burning ในขณะที่ User Shell Folders ไม่มีค่าสตริงทั้งสองนั้น นอกจากนี้ Shell Folders ยังมีเฉพาะค่าสตริงประเภท REG_SZ ที่มีเส้นทางแบบเต็มไปยังแต่ละโฟลเดอร์ในขณะที่ User Shell Folders มีค่าสตริงประเภท REG_EXPAND_SZ ที่มีการอ้างอิงตัวแปรสภาพแวดล้อม %USERPROFILE% (ยกเว้นที่ฉันแก้ไข) ดังนั้นจึงง่ายกว่าที่จะใช้ Shell Folders ในไฟล์แบตช์ธรรมดา เนื่องจากเส้นทางโฟลเดอร์เป็นเส้นทางสัมบูรณ์ที่ขยายอยู่แล้ว - person Mofi; 12.08.2017
comment
@Mofi สิ่งที่น่าสนใจคือ [environment]::getfolderpath('nonexistent') ใน PowerShell จะแสดงรายการชื่อโฟลเดอร์ที่ถูกต้องในข้อความแสดงข้อผิดพลาด - person ; 12.08.2017
comment
ใช่แน่นอน. สิ่งที่น่าสนใจจริงๆ เพราะค่าบางค่าในรีจิสทรีไม่ได้แสดงโดย PowerShell ในข้อความแสดงข้อผิดพลาด และไม่สามารถสอบถามได้ด้วยวิธีนี้ เช่น NetHood หรือ Fonts พวกมันไม่ใช่โฟลเดอร์เชลล์ผู้ใช้จริงๆ ตามที่เขียนไว้ในรีจิสทรีของ Windows 7 ขอแนะนำให้ใช้ SHGetFolderPath หรือ SHGetKnownFolderPath ด้วย KNOWNFOLDERID เหมือนกับที่ PowerShell ทำ - person Mofi; 12.08.2017