2012-09-21 168 views
1

我正在寫一個短批處理腳本,它嘗試取第一行文本文件並刪除尾部反斜槓(如果存在)。然後這將重複輸入文件的其餘行。但是,當我運行腳本時,行不會刪除反斜槓。我的猜測是這是一個簡單的修復,但我已經嘗試了幾種故障排除方法,但沒有運氣。代碼在下面發佈供參考。謝謝!刪除批處理文件中的尾部反斜槓

@echo on 
setLocal EnableDelayedExpansion 

::set firstline to firstline of test.txt 
set /p firstline=<test.txt 

::Remove trailing slash if present 
IF !firstline:~-1!==\ SET firstline=!firstline:~0,-1! 

::Output firstline (without \ to new txt file) 
echo !firstline!>test2.txt 

endlocal 

test.txt文件:

C:\Desktop\example\path\ 

C:\Desktop\example\path\2\ 

C:\Desktop\example\path\test\ 

回答

4

你是正確的,這是一個簡單的問題。實際上它是通過引入4個字符來解決的,它們都是相同的。

批量公開反斜槓是個壞主意,它很可能會讓解釋器認爲它處理的是實際的文件或路徑。你應該用雙引號包圍它。對於其他字符也是如此,包括!%& *?/ \ <> ,.大多數是處理路徑和文件的特殊字符。可能會有更多,有些只是偶爾出現問題。緊鄰重定向字符時,即使是1和2也會造成麻煩。

爲了讓您知道,setlocal或延遲擴展符號!在這裏是必要的,雖然它沒有任何傷害。 (除了延遲表示法使調試更加困難,因爲在這種情況下,通過顯示ECHO爲On時的變量名稱而非內容)。

此外,修剪字符串的最後一個字符時, t在:~0,-1需要0,使用:~,-1就足夠了。儘管這樣做沒有害處。

最後,echo on是不必要的,因爲echo on是默認值。 Echo On更適用於顯示長文件執行的小部分。雖然,再一次,它沒有傷害。

@echo on 
setLocal EnableDelayedExpansion 

::set firstline to firstline of test.txt 
set /p firstline=<test.txt 

::Remove trailing slash if present 
::Your error is below this 
IF "!firstline:~-1!"=="\" SET firstline=!firstline:~,-1! 

::Output firstline (without \ to new txt file) 
echo !firstline!>test2.txt 

endlocal 
+0

感謝您的澄清詹姆斯。但是,當我用test.txt(現在列在原始問題中)測試文件時,尾部的反斜槓仍然沒有被刪除。還有什麼我失蹤? –

+0

@JeffK - 你可能真的在該行的末尾有一個尾部空格。這樣做的結果是:'ECHO%stuff%> file'看起來比'ECHO%stuff%file>好,但在每行的末尾添加一個空格。實際上,如果您使用echo!firstline,則每次運行我的代碼時都會增加__another__額外的空間! > test2.txt',而不是'echo!firstline!> test2.txt'。 –

+0

你的觀察是正確的,我也通過使用下面的一行來解決這個問題(考慮到空間):「IF」!firstline:〜-2!「==」\「SET firstline =!firstline:〜 ,-2!'。非常感謝你的幫助,我很感激! –