2017-10-21 97 views
0

我需要通過創建新文件夾來移動文件。下面是編寫的代碼。這工作得很好。將文件名中的點和特殊字符替換到另一個位置之前

但是,如果文件名包含多餘的點,空格和特殊字符(如圓括號),代碼會失敗。

請求您讓我知道在將文件移動到目標位置之前如何替換/重命名點,空格和特殊字符。

if not exist "D:\KUMAR_398519667_9262017" mkdir D:\KUMAR_398519667_9262017 
move D:\%2 D:\KUMAR_398519667_9262017 

注意:%2是從觸發過程傳遞到bat文件的文件名。

在此先感謝。

+1

沒有理由額外的時間將永遠具有影響在你的腳本上。空格,當然,但不是句號。始終將所有文件路徑換成引號。 – SomethingDark

+0

@SomethingDark - 在調用代碼中需要引號,而不一定在移動腳本中。請參閱[我的答案](https://stackoverflow.com/a/46864937/1012053) – dbenham

回答

0

簡而言之引號的名稱:

move "D:\%~2" "D:\KUMAR_398519667_9262017" 
0

問題最有可能的是不是你的「移動」腳本中,而是在被調用的「移動」的腳本代碼。

不管何時你傳遞一個字符串字面量可能包含像<space><tab>=,像&;,,或特殊字符,那麼你就應該附上引號中的參數標記分隔符。

假設你的腳本稱爲moveFile.bat,並要移動c:\some path with spaces\yourFile,那麼你的電話應該是這樣的:

call moveFile arg1 "some path with spaces\yourFile" 

你的腳本將然後正確地執行

move D:\"some path with spaces\yourFile" D:\KUMAR_398519667_9262017 

如果你忽略引用該論點,然後%2將被解析爲c:\some,當然這將無法正常工作。

有人會說,你應該使用%~2,以消除任何現有的封閉引號,然後明確地添加自己周圍的整個路徑,如

move "D:\%~2" D:\KUMAR_398519667_9262017 

在這種情況下,執行命令變得更熟悉的期待

move "D:\some path with spaces\yourFile" D:\KUMAR_398519667_9262017 

這當然也可以,但是沒有必要。

整體設計存在一個潛在的問題 - 它不能支持既包含空格又包含插入符號(^)的路徑,因爲必須引用路徑,但CALL語句將有效地將所有引用的插入符號加倍。

所以call moveFile arg1 "some path with spaces\A^B.txt"會導致以下:

move D:\"some path with spaces\A^^B.txt" D:\KUMAR_398519667_9262017 

絕對沒有,你可以做些什麼來防止引用插入符號,當您使用CALL加倍 。最好的選擇是通過引用傳遞你的路徑作爲變量名。顯然這需要改變moveFile。蝙蝠:

這裏有必要的修改,以moveFile.bat:

setlocal enableDelayedExpansion 
if not exist "D:\KUMAR_398519667_9262017" mkdir D:\KUMAR_398519667_9262017 
move "D:\!%2!" D:\KUMAR_398519667_9262017 

而且你的代碼調用moveFile應該是這樣的:

set "myFile=some path with spaces\A^B" 
call moveFile arg1 myFile 
+0

嗨dbenham,感謝您的詳細回覆,它似乎是調用過程的問題,我從Siebel escript調用bat文件。在將雙引號添加到bat文件腳本後,它在通過cmd運行以及雙擊時正常工作。但是當試圖從siebel腳本執行bat文件時,這同樣不起作用。 Siebel代碼如下 – Kumar

+0

Siebel代碼如下:「batstatus = Clib.system(」D:\\ MoveFiles.bat「+」「+ sDestDir +」「+ sUnCompFilePath);」其中sDesDir是目標目錄參數,sUnCompFilePath是文件路徑。謝謝。 – Kumar

+0

@Kumar - 嘗試在Siebel中構建完整的字符串,然後將其打印到屏幕或文件中,而不執行。一旦你得到正確的語法,然後將該字符串傳遞給'Clib.system()'。 – dbenham