比較 Windows 批次檔中的部分檔名

比較 Windows 批次檔中的部分檔名

考慮這個腳本:

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\ )

相關內容