
考慮這個腳本:
SETLOCAL EnableDelayedExpansion
for /F "tokens=2 delims=." %%G in ("%1") do set partial_name = %%G
if partial_name GEQ 9200 ( move I:\rosa\transfertmp\%1 L:\OSLDos\Tmp\ ) else ( move I:\rosa\transfertmp\%1 L:\LdisOSLDos\Tmp\ )
ENDLOCAL
調用為thisscript 11111.9100.csv
我想要做的是:根據文件名的第二段(9100)將文件移動到正確的資料夾,因此如果它大於9200,則將其移動到一個資料夾,如果不大於,則移動到另一個資料夾。
問題似乎是比較不起作用。
答案1
丹尼斯發現了一個問題,並在他的回答中提供了解決方案。但還存在其他問題。
1) 您的程式碼set partial_name = %%G
將在變數名稱中包含尾隨空格,在值中包含前導空格。程式碼應該是這樣的set partial_name=%%G
2) 您的%1
值可能已被引用,在這種情況下,您應該在新增自己的值之前刪除引號,然後使用"%~1"
代替"%1"
。
3)對於您的情況也許不是問題,但通常最好將檔案路徑括在引號中,以防名稱包含空格或特殊字元。
4)我假設您想要進行數字比較。 IF 指令在嘗試解析數字時使用與 SET /A 指令幾乎相同的規則 - 任何前綴為 0 的數字都會被視為十六進位表示法。如果它發現無效的十六進位數字(例如 8 或 9),則 IF 將恢復為字串比較而不是數字比較。
例如if 09 lss 8 (echo true) else echo false
返回true
.
因此,如果檔案名稱的第二段可能有前導零,那麼您需要做更多的工作。
set "partial_name="
for /f "tokens=2 delims=." %%G in ("%~1") do (
for /f "tokens=* delims=0" %%N in ("%%G") do set /a "partial_name=%%N"
if not defined partial_name set "partial_name=0"
)
if %partial_name% GEQ 9200 (
move "I:\rosa\transfertmp\%1" "L:\OSLDos\Tmp\"
) else (
move "I:\rosa\transfertmp\%1" "L:\LdisOSLDos\Tmp\"
)
答案2
您實際上是將字串partial_name
與進行比較9100
,而不是變數的內容。
因為p GEQ 9
,這將評估為 true。
另外,set partial_name = %%G
設定partial_name
為 %%G
(注意尾隨和前導空格)。
要解決這兩個問題,請用百分號 ( ) 包圍變數名稱,%
並刪除等號 ( =
) 周圍的空格:
for /F "tokens=2 delims=." %%G in ("%1") do set partial_name=%%G
if %partial_name% GEQ 9200 ( move I:\rosa\transfertmp\%1 L:\OSLDos\Tmp\ ) else ( move I:\rosa\transfertmp\%1 L:\LdisOSLDos\Tmp\ )