1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521 2522 2523 2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571 2572 2573 2574 2575 2576 2577 2578 2579 2580 2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596 2597 2598 2599 2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 2610 2611 2612 2613 2614 2615 2616 2617 2618 2619 2620 2621 2622 2623 2624 2625 2626 2627 2628 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651 2652 2653 2654 2655 2656 2657 2658 2659 2660 2661 2662 2663 2664 2665 2666 2667 2668 2669 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681 2682 2683 2684 2685 2686 2687 2688 2689 2690 2691 2692 2693 2694 2695 2696 2697 2698 2699 2700 2701 2702 2703 2704 2705 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 2736 2737 2738 2739 2740 2741 2742 2743 2744 2745 2746 2747 2748 2749 2750 2751 2752 2753 2754 2755 2756 2757 2758 2759 2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774 2775 2776 2777 2778 2779 2780 2781 2782 2783 2784 2785 2786 2787 2788 2789 2790 2791 2792 2793 2794 2795 2796 2797 2798 2799 2800 2801 2802 2803 2804 2805 2806 2807 2808 2809 2810 2811 2812 2813 2814 2815 2816 2817 2818 2819 2820 2821 2822 2823 2824 2825 2826 2827 2828 2829 2830 2831 2832 2833 2834 2835 2836 2837 2838 2839 2840 2841 2842 2843 2844 2845 2846 2847 2848 2849 2850 2851 2852 2853 2854 2855 2856 2857 2858 2859 2860 2861 2862 2863 2864 2865 2866 2867 2868 2869 2870 2871 2872 2873 2874 2875 2876 2877 2878 2879 2880 2881 2882 2883 2884 2885 2886 2887 2888 2889 2890 2891 2892 2893 2894 2895 2896 2897 2898 2899 2900 2901 2902 2903 2904 2905 2906 2907 2908 2909 2910 2911 2912 2913 2914 2915 2916 2917 2918 2919 2920 2921 2922 2923 2924 2925 2926 2927 2928 2929 2930 2931 2932 2933 2934 2935 2936 2937 2938 2939 2940 2941 2942 2943 2944 2945 2946 2947 2948 2949 2950 2951 2952 2953 2954 2955 2956 2957 2958 2959 2960 2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 2976 2977 2978 2979 2980 2981 2982 2983 2984 2985 2986 2987 2988 2989 2990 2991 2992 2993 2994 2995 2996 2997 2998 2999 3000 3001 3002 3003 3004 3005 3006 3007 3008 3009 3010 3011 3012 3013 3014 3015 3016 3017 3018 3019 3020 3021 3022 3023 3024 3025 3026 3027 3028 3029 3030 3031 3032 3033 3034 3035 3036 3037 3038 3039 3040 3041 3042 3043 3044 3045 3046 3047 3048 3049 3050 3051 3052 3053 3054 3055 3056 3057 3058 3059 3060 3061 3062 3063 3064 3065 3066 3067 3068 3069 3070 3071 3072 3073 3074 3075 3076 3077 3078 3079 3080 3081 3082 3083 3084 3085 3086 3087 3088 3089 3090 3091 3092 3093 3094 3095 3096 3097 3098 3099 3100 3101 3102 3103 3104 3105 3106 3107 3108 3109 3110 3111 3112 3113 3114 3115 3116 3117 3118 3119 3120 3121 3122 3123 3124 3125 3126 3127 3128 3129 3130 3131 3132 3133 3134 3135 3136 3137 3138 3139 3140 3141 3142 3143 3144 3145 3146 3147 3148 3149 3150 3151 3152 3153 3154 3155 3156 3157 3158 3159 3160 3161 3162 3163 3164 3165 3166 3167 3168 3169 3170 3171 3172 3173 3174 3175 3176 3177 3178 3179 3180 3181 3182 3183 3184 3185 3186 3187 3188 3189 3190 3191 3192 3193 3194 3195 3196 3197 3198 3199 3200 3201 3202 3203 3204 3205 3206 3207 3208 3209 3210 3211 3212 3213 3214 3215 3216 3217 3218 3219 3220 3221 3222 3223 3224 3225 3226 3227 3228 3229 3230 3231 3232 3233 3234 3235 3236 3237 3238 3239 3240 3241 3242 3243 3244 3245 3246 3247 3248 3249 3250 3251 3252 3253 3254 3255 3256 3257 3258 3259 3260 3261 3262 3263 3264 3265 3266 3267 3268 3269 3270 3271 3272 3273 3274 3275 3276 3277 3278 3279 3280 3281 3282 3283 3284 3285 3286 3287 3288 3289 3290 3291 3292 3293 3294 3295 3296 3297 3298 3299 3300 3301 3302 3303 3304 3305 3306 3307 3308 3309 3310 3311 3312 3313 3314 3315 3316 3317 3318 3319 3320 3321 3322 3323 3324 3325 3326 3327 3328 3329 3330 3331 3332 3333 3334 3335 3336 3337 3338 3339 3340 3341 3342 3343 3344 3345 3346 3347 3348 3349 3350 3351 3352 3353 3354 3355 3356 3357 3358 3359 3360 3361 3362 3363 3364 3365 3366 3367 3368 3369 3370 3371 3372 3373 3374 3375 3376 3377 3378 3379 3380 3381 3382 3383 3384 3385 3386 3387 3388 3389 3390 3391 3392 3393 3394 3395 3396 3397 3398 3399 3400 3401 3402 3403 3404 3405 3406 3407 3408 3409 3410 3411 3412 3413 3414 3415 3416 3417 3418 3419 3420 3421 3422 3423 3424 3425 3426 3427 3428 3429 3430 3431 3432 3433 3434 3435 3436 3437 3438 3439 3440 3441 3442 3443 3444 3445 3446 3447 3448 3449 3450 3451 3452 3453 3454 3455 3456 3457 3458 3459 3460 3461 3462 3463 3464 3465 3466 3467 3468 3469 3470 3471 3472 3473 3474 3475 3476 3477 3478 3479 3480 3481 3482 3483 3484 3485 3486 3487 3488 3489 3490 3491 3492 3493 3494 3495 3496 3497 3498
| DOS批处理高级教程
前言
本教程主要引用伤脑筋版主的系列文章,同时参考引用[英雄]教程等其他批处理教程,本文将这些文章合并在一起,并尽量修改得详细而且简单易懂,修改整理也是学习过程,主要目的是方便自己以后查阅。 本教程很长啊,需要一定的耐心才能看完,能够看完的话,差不多就是批处理高手了,即使不是高手也是熟手了。本教程还在不断补充之中,当有比较典型的应用技巧时,本教材会将其收入相关的章节之中。本教程适合对dos有一定基础的人慢慢学习或查阅。 查阅方法:复制目录中的条目,搜索即可。 整理者邮箱:[email protected],如果你要全文或有好的dos使用经验,请你发email给我,谢谢!
目录
第一章 批处理基础 第一节 常用批处理内部命令简介 1、REM 和 :: 2、ECHO 和 @ 3、PAUSE 暂停 4、ERRORLEVEL 5、TITLE 设置cmd窗口的标题 6、COLOR 设置cmd窗口前景和背景颜色 7、mode 配置系统设备 8、GOTO 和 : 9、FIND 在文件中搜索字符串 10、START 调用外部程序并任其在新窗口自行运行 11、assoc 和 ftype 12、pushd 和 popd 13、CALL 调用批处理程序或命令并等待其执行完毕 14、shift 15、IF 16、setlocal 与 变量延迟 17、ATTRIB 显示或更改文件属性 18、findstr 在文件中搜索字符串(find增强版) 19、date /t 和 time /t
第二节 常用特殊符号 1、@ 命令行回显屏蔽符 2、% 批处理变量引导符 3、> 输出重定向符 4、>> 输出重定向符 5、<、>&、<& 重定向符 6、| 命令管道符 7、^ 转义字符 8、& 组合命令(顺序执行) 9、&& 组合命令(前面指令成功,才执行后面指令) 10、|| 组合命令(前面指令失败,才执行后面指令) 11、"" 字符串界定符 12、, 逗号 13、; 分号 14、() 括号 15、! 感叹号 16、批处理中可能会见到的其它特殊标记符: (略) CR(0D) 命令行结束符 Escape(1B) ANSI转义字符引导符 Space(20) 常用的参数界定符 Tab(09) ; = 不常用的参数界定符 + COPY命令文件连接符 * ? 文件通配符 / 参数开关引导符 : 批处理标签引导符
第二章 FOR命令详解 一、基本格式 二、参数 /d 主要搜索匹配目录 三、参数 /R 搜索指定目录树中的匹配文件 四、参数 /L 按数字序列(start,step,end)循环 五、参数 /F 处理命令输出、字符串及文件内容
第三章 FOR命令中的变量 一、 ~I - 删除任何引号("),扩展 %I 二、 %~fI - 将 %I 扩展到一个完全合格的路径名 三、 %~dI - 仅将 %I 扩展到一个驱动器号 四、 %~pI - 仅将 %I 扩展到一个路径 五、 %~nI - 仅将 %I 扩展到一个文件名 六、 %~xI - 仅将 %I 扩展到一个文件扩展名 七、 %~sI - 扩展的路径只含有短名 八、 %~aI - 将 %I 扩展到文件的文件属性 九、 %~tI - 将 %I 扩展到文件的日期/时间 十、 %~zI - 将 %I 扩展到文件的大小 十一、 %~$PATH:I
第四章 批处理中的变量 一、系统变量 二、自定义变量
第五章 set命令详解 一、用set命令设置自定义变量 二、用set命令进行简单计算 三、用set命令进行字符串处理 1、字符串替换 2、字符串截取
第六章 if命令讲解 第一种用法:IF [NOT] ERRORLEVEL number command 第二种用法:IF [NOT] string1==string2 command 第三种用法:IF [NOT] EXIST filename command 第四种用法:IF增强的用法
第七章 DOS编程高级技巧 一、交互界面设计 二、if…else…条件语句 三、循环语句 四、子程序 五、用ftp命令实现自动下载 六、用7-ZIP实现命令行压缩和解压功能 七、调用VBScript程序 八、将批处理转化为可执行文件 九、时间延迟 1、利用ping命令延时 2、利用for命令延时 3、利用vbs延迟函数,精确度毫秒,误差1000毫秒内 4、仅用批处理命令实现任意时间延迟,精确度10毫秒,误差50毫秒内 十、模拟进度条 十一、特殊字符的输入及应用 十二、随机数(%random%)的应用技巧 十三、变量嵌套 与 命令嵌套 十四、文件内容筛选(type和findstr命令结合使用)
全文:http://xiangkg.blog.163.com 1、更正了所有的错别字,适当排版,增加条理性。 2、运行改善所有例子,并纠正了一些语法错误。 3、补充了一些不完全的地方。 4、第一章参考了网上许多教程汇编而成。 5、20080229补充了变量延迟的问题。 6、20080305修改了参数usebackq的说明 7、20080310增加了特殊字符的输入及应用 8、20080311修改了子程序部分 9、20080313修改了echo说明,归纳了9个应用方法 10、20080320增加任意时间延迟方法 11、20080321增加了set计算中十进制与八进制混淆问题的说明 12、20080325修正dos数值计算范围:-2147483648至2147483647,即-2^31~2^31-1 13、20080326增加随机数的应用 14、20080327修改了“if增强用法”中的defined语句说明 15、20080402增加变量嵌套与命令嵌套,重要技巧之一。
不断学习中,不断更新中。
====================================================================== 第一章 批处理基础
批处理定义:顾名思义,批处理文件是将一系列命令按一定的顺序集合为一个可执行的文本文件,其扩展名为BAT或者CMD。这些命令统称批处理命令。
小知识:可以在键盘上按下Ctrl+C组合键来强行终止一个批处理的执行过程。
了解了大概意思后,我们正式开始学习.先看一个简单的例子!
@echo off echo "欢迎来到非常BAT!" pause
把上面的3条命令保存为文件test.bat或者test.cmd然后执行, 他就会在屏幕上显示以下二行话:
欢迎来到非常BAT! 请按任意键继续. . .
这就是一个简单批处理文件了,这个批处理文件一共就用了2条命令 "echo" 和"pause" 还有一个特殊符号"@"
从上面这个简单的批处理中,我们可以发现其实批处理就是运用一些含有特殊意义的符号和一些完成指定功能的命令组合而成,那么在批处理中有多少这样的特殊符号和功能命令呢?我们现在就来仔细了解一下一些最常用的!
(以下内容来源网络,请各位仔细阅读,好进入下节的实例说明)
========================================================================== 第一节 常用批处理内部命令简介 1、REM 和 :: 2、ECHO 和 @ 3、PAUSE 暂停 4、ERRORLEVEL 5、TITLE 设置cmd窗口的标题 6、COLOR 设置cmd窗口前景和背景颜色 7、mode 配置系统设备 8、GOTO 和 : 9、FIND 在文件中搜索字符串 10、START 调用外部程序并任其在新窗口自行运行 11、assoc 和 ftype 12、pushd 和 popd 13、CALL 调用批处理程序或命令并等待其执行完毕 14、shift 15、IF 16、setlocal 与 变量延迟 17、ATTRIB 显示或更改文件属性 18、findstr 在文件中搜索字符串(find增强版) 19、date /t 和 time /t
介绍命令
1、REM 和 ::
REM为注释命令,一般用来给程序加上注解,该命令后的内容不被执行,但能回显。
:: 也可以起注释作用, 而且更简洁有效; 但有两点需要注意:
①任何以冒号:开头的字符行, 在批处理中都被视作标号, 而直接忽略其后的所有内容。而标号分为有效和无效两种。 有效标号:冒号后紧跟一个以字母数字开头的字符串,goto语句可以识别。 无效标号:冒号后紧跟一个非字母数字的一个特殊符号,goto无法识别的标号。
无效可以起到注释作用,所以 :: 常被用作注释符号,其实 :+ 也可起注释作用。
②与rem 不同的是, ::后的字符行在执行时不会回显, 无论是否用echo on打开命令行回显状态, 因为命令解释器不认为他是一个有效的命令行, 就此点来看, rem 在某些场合下将比 :: 更为适用; 另外, rem 可以用于 config.sys 文件中。
行内注释格式:%注释内容% (不常用,容易引起语法错误,慎用少用)
2、ECHO 和 @
@字符放在命令前将关闭该命令回显,无论此时echo是否为打开状态。
echo命令的作用列举如下:
(1)打开回显或关闭回显功能 格式:echo [{ on|off }]
如果想关闭“ECHO OFF”命令行自身的显示,则需要在该命令行前加上“@”。
(2)显示当前ECHO设置状态 格式:echo
(3)输出提示信息
格式:ECHO 信息内容
上述是ECHO命令常见的三种用法,也是大家熟悉和会用的,但作为DOS命令淘金者你还应该知道下面的技巧:
(4)关闭DOS命令提示符 在DOS提示符状态下键入ECHO OFF,能够关闭DOS提示符的显示使屏幕只留下光标,直至键入ECHO ON,提示符才会重新出现。
(5)输出空行,即相当于输入一个回车
格式:ECHO.
值得注意的是命令行中的“.”要紧跟在ECHO后面中间不能有空格,否则“.”将被当作提示信息输出到屏幕。另外“.”可以用,:;”/[\]+等任一符号替代。
命令ECHO.输出的回车,经DOS管道转向可以作为其它命令的输入,比如echo.|time即相当于在TIME命令执行后给出一个回车。所以执行时系统会在显示当前时间后,自动返回到DOS提示符状态
(6)答复命令中的提问
格式:ECHO 答复语|命令文件名
上述格式可以用于简化一些需要人机对话的命令(如:CHKDSK/F;FORMAT Drive:;del *.*)的操作,它是通过DOS管道命令把ECHO命令输出的预置答复语作为人机对话命令的输入。下面的例子就相当于在调用的命令出现人机对话时输入“Y”回车:
C:>ECHO Y|CHKDSK/F
C:>ECHO Y|DEL A :*.*
(7)建立新文件或增加文件内容
格式:ECHO 文件内容>文件名 ECHO 文件内容>>文件名
例如: C:>ECHO @ECHO OFF>AUTOEXEC.BAT 建立自动批处理文件 C:>ECHO C:\CPAV\BOOTSAFE>>AUTOEXEC.BAT 向自动批处理文件中追加内容
(8)向打印机输出打印内容或打印控制码
格式:ECHO 打印机控制码>PRN
ECHO 打印内容>PRN
用得很少,了解就可以了
下面的例子是向M-1724打印机输入打印控制码。<Alt>156是按住Alt键在小键盘键入156,类似情况依此类推:
C:>ECHO +156+42+116>PRN(输入下划线命令FS*t)
C:>ECHO PRN">+155@>PRN(输入初始化命令ESC@)
C:>ECHO.>PRN(换行)
(9)使喇叭鸣响
C:>ECHO ^G
“^G”是在dos窗口中用Ctrl+G或Alt+007输入,输入多个^G可以产生多声鸣响。使用方法是直接将其加入批处理文件中或做成批处理文件调用。 这里的“^G”属于特殊符号的使用,请看本文后面的章节
3、PAUSE 暂停
PAUSE,玩游戏的人都知道,暂停的意思 在这里就是停止系统命令的执行并显示下面的内容。
例: PAUSE
运行显示: 请按任意键继续. . .
要显示其他提示语,可以这样用: Echo 其他提示语 & pause > nul
4、errorlevel 程序返回码
echo %errorlevel% 每个命令运行结束,可以用这个命令行格式查看返回码 用于判断刚才的命令是否执行成功 默认值为0,一般命令执行出错会设 errorlevel 为1
5、title 设置cmd窗口的标题 设置cmd窗口的标题,批处理编程常用。 title 新标题 #可以看到cmd窗口的标题栏变了
6、COLOR 设置cmd窗口前景和背景颜色 设置默认的控制台前景和背景颜色。批处理编程常用。
COLOR [attr]
attr 指定控制台输出的颜色属性
颜色属性由两个十六进制数字指定 -- 第一个为背景,第二个则为 前景。每个数字可以为以下任何值之一:
0 = 黑色 8 = 灰色 1 = 蓝色 9 = 淡蓝色 2 = 绿色 A = 淡绿色 3 = 湖蓝色 B = 淡浅绿色 4 = 红色 C = 淡红色 5 = 紫色 D = 淡紫色 6 = 黄色 E = 淡黄色 7 = 白色 F = 亮白色
如果没有给定任何参数,该命令会将颜色还原到 CMD.EXE 启动时 的颜色。这个值来自当前控制台窗口、/T 开关或 DefaultColor 注册表值。
如果用相同的前景和背景颜色来执行 COLOR 命令,COLOR 命令 会将 ERRORLEVEL 设置为 1。
例如: "COLOR fc" 在亮白色上产生亮红色
7、mode 配置系统设备
配置系统设备。
串行口: MODE COMm[:] [BAUD=b] [PARITY=p] [DATA=d] [STOP=s] [to=on|off] [xon=on|off] [odsr=on|off] [octs=on|off] [dtr=on|off|hs] [rts=on|off|hs|tg] [idsr=on|off]
设备状态: MODE [device] [/STATUS]
打印重定向: MODE LPTn[:]=COMm[:]
选定代码页: MODE CON[:] CP SELECT=yyy
代码页状态: MODE CON[:] CP [/STATUS]
显示模式: MODE CON[:] [COLS=c] [LINES=n]
击键率: MODE CON[:] [RATE=r DELAY=d]
例:设置dos窗口和颜色 mode con cols=113 lines=15 & color 9f 此命令设置DOS窗口大小:15行,113列
8、GOTO 和 : GOTO会点编程的朋友就会知道这是跳转的意思。 在批处理中允许以“:XXX”来构建一个标号,然后用GOTO XXX跳转到标号:XXX处,然后执行标号后的命令。 例: if {%1}=={} goto noparms if "%2"=="" goto noparms
标签的名字可以随便起,但是最好是有意义的字符串啦,前加个冒号用来表示这个字符串是标签,goto命令就是根据这个冒号(:)来寻找下一步跳到到那里。最好有一些说明这样你别人看起来才会理解你的意图啊。
例: @echo off :start set /a var+=1 echo %var% if %var% leq 3 GOTO start pause 运行显示: 1 2 3 4
休息一下 ---------------------------- 遭遇失事的外星人 ---------------------------- 来无影去无踪的UFO困扰了人类很长时间。可现在人们发现,功能特异的外星人也会有失事的时候。前苏联科学家杜朗诺克博士曾透露,1987年11月,一支前苏联沙漠考察队在沙漠里发现了一个直径22.87米的碟状飞行器。飞碟引擎保持完好,里面有14具已经风干成木乃伊的外星人遗体。1947年7月6日夜,美国新墨西哥州小镇罗兹维尔附近风雨大作,电闪雷鸣。第二天天睛后,人们发现了一个圆形的东西躺在草丛里。驻扎在附近的空军迅速赶来,封锁了现场。负责人马赛尔上尉详细地检查了该物体的状况。它直径足有10米,分为内、外两个舱。令他大吃一惊的是,舱内的座椅上竟然有4具类人生物的尸体。它们身高仅有1米左右,皮肤白而细腻,头很大,鼻子很长,嘴很小。手上只有4个指头,指间有蹼相连。它们身穿黑色有金属光泽的外套,但是质地很柔软。这一发现震惊了军方,五角大楼立即下令封锁消息,但消息灵通的记者已经将此新闻发布了出去。许多当地人都证实确实有飞碟在罗兹维尔附近坠毁。 ————选自《世界未解之谜》
9、find 在文件中搜索字符串 在文件中搜索字符串。
FIND [/V] [/C] [/N] [/I] [/OFF[LINE]] "string" [[drive:][path]filename[ ...]]
/V 显示所有未包含指定字符串的行。 /C 仅显示包含字符串的行数。 /N 显示行号。 /I 搜索字符串时忽略大小写。 /OFF[LINE] 不要跳过具有脱机属性集的文件。 "string" 指定要搜索的文字串, [drive:][path]filename 指定要搜索的文件。
如果没有指定路径,FIND 将搜索键入的或者由另一命令产生的文字。
Find常和type命令结合使用 Type [drive:][path]filename | find "string" [>tmpfile] #挑选包含string的行 Type [drive:][path]filename | find /v "string" #剔除文件中包含string的行 Type [drive:][path]filename | find /c #显示文件行数 以上用法将去除find命令自带的提示语(文件名提示)
例: @echo off echo 111 >test.txt echo 222 >>test.txt find "111" test.txt pause 运行显示如下:
---------- TEST.TXT 111 请按任意键继续. . .
例: @echo off echo 111 >test.txt echo 222 >>test.txt type test.txt|find "111" pause 运行显示如下: 111 请按任意键继续. . .
学习久了,容易瞌睡,清醒清醒,请看: ---------------------------- 月球上有轰炸机吗 ---------------------------- 1987年3月,前苏联的一颗人造卫星拍摄到的月球照片上,出现了一架第二次世界大战时期的英国轰炸机。这架飞机机身和机翼上有明显的英国空军标志,飞机有些地方已被陨石损坏,但机体完整,机身上布满青苔。它停放在月球的火山口上。照片清晰,令人不容置疑。消息传出后,立即成为轰动世界的头号新闻。但是,正当科学家们紧锣密鼓地展开研究时,1988年7月22日,负责观察的人报告说:这架轰炸机失踪,在原来的地方没有发现它的影子。轰炸机的突然出现,又忽然间消失得无影无踪,引起了科学家们的种种猜测。有人开始怀疑前苏联人造卫星拍到的照片上根本没有什么轰炸机,但是拿来照片重新细看,它明明清清楚楚地呈现在人们面前,到底是不是真事?那么现在它又在哪里?这给本来就很神秘的这架轰炸机又增添了更为神秘的色彩。 ————选自《世界未解之谜》
10、start 调用外部程序并任其在新窗口自行运行
批处理中调用外部程序的命令(该外部程序在新窗口中运行,批处理程序继续往下执行,不理会外部程序的运行状况),如果直接运行外部程序则必须等外部程序完成后才继续执行剩下的指令
例:start explorer d:\ 调用图形界面打开D盘
11、assoc 和 ftype 文件关联,不常用。 assoc 设置'文件扩展名'关联,关联到'文件类型' ftype 设置'文件类型'关联,关联到'执行程序和参数' 当你双击一个.txt文件时,windows并不是根据.txt直接判断用 notepad.exe 打开 而是先判断.txt属于 txtfile '文件类型' 再调用 txtfile 关联的命令行 txtfile=%SystemRoot%\system32\NOTEPAD.EXE %1 可以在"文件夹选项"→"文件类型"里修改这2种关联 assoc #显示所有'文件扩展名'关联 assoc .txt #显示.txt代表的'文件类型',结果显示 .txt=txtfile assoc .doc #显示.doc代表的'文件类型',结果显示 .doc=Word.Document.8 assoc .exe #显示.exe代表的'文件类型',结果显示 .exe=exefile ftype #显示所有'文件类型'关联 ftype exefile #显示exefile类型关联的命令行,结果显示 exefile="%1" %* assoc .txt=Word.Document.8 设置.txt为word类型的文档,可以看到.txt文件的图标都变了 assoc .txt=txtfile 恢复.txt的正确关联 ftype exefile="%1" %* 恢复 exefile 的正确关联 如果该关联已经被破坏,可以运行 command.com ,再输入这条命令
12、pushd 和 popd
PUSHD [path | ..] 保存当前目录,然后切换到另一个指定的目录path。 popd 将当前目录恢复为pushd命令保存的目录
@echo off c: & cd\ & md mp3 #在 C:\ 建立 mp3 文件夹 md d:\mp4 #在 D:\ 建立 mp4 文件夹 cd /d d:\mp4 #更改当前目录为 d:\mp4,cd命令的/d参数可改变盘符。 pushd c:\mp3 #保存当前目录,并切换当前目录为 c:\mp3 popd #恢复当前目录为刚才保存的 d:\mp4 一般用处不大,在当前目录名不确定时,会有点帮助。(dos编程中很有用)
13、CALL 调用批处理程序或命令并等待其执行完毕
CALL命令可以在批处理执行过程中调用另一个批处理,当另一个批处理执行完后,再继续执行原来的批处理
CALL command 调用一条批处理命令,和直接执行命令效果一样,特殊情况下很有用,比如变量的多级嵌套,见教程后面。在批处理编程中,可以根据一定条件生成命令字符串,用call可以执行该字符串,见例子。
CALL [drive:][path]filename [batch-parameters] 调用的其它批处理程序。filename 参数必须具有 .bat 或 .cmd 扩展名。
CALL :label arguments 调用本文件内命令段,相当于子程序。被调用的命令段以标签:label开头 以命令goto :eof结尾。
另外,批脚本文本参数参照(%0、%1、等等)已如下改变:
批脚本里的 %* 指出所有的参数(如 %1 %2 %3 %4 %5 ...)
批参数(%n)的替代已被增强。您可以使用以下语法:(看不明白的直接运行后面的例子)
%~1 - 删除引号("),扩充 %1 %~f1 - 将 %1 扩充到一个完全合格的路径名 %~d1 - 仅将 %1 扩充到一个驱动器号 %~p1 - 仅将 %1 扩充到一个路径 %~n1 - 仅将 %1 扩充到一个文件名 %~x1 - 仅将 %1 扩充到一个文件扩展名 %~s1 - 扩充的路径指含有短名 %~a1 - 将 %1 扩充到文件属性 %~t1 - 将 %1 扩充到文件的日期/时间 %~z1 - 将 %1 扩充到文件的大小 %~$PATH : 1 - 查找列在 PATH 环境变量的目录,并将 %1 扩充到找到的第一个完全合格的名称。如果环境 变量名未被定义,或者没有找到文件,此组合键会 扩充到空字符串
可以组合修定符来取得多重结果:
%~dp1 - 只将 %1 扩展到驱动器号和路径 %~nx1 - 只将 %1 扩展到文件名和扩展名 %~dp$PATH:1 - 在列在 PATH 环境变量中的目录里查找 %1, 并扩展到找到的第一个文件的驱动器号和路径。 %~ftza1 - 将 %1 扩展到类似 DIR 的输出行。
在上面的例子中,%1 和 PATH 可以被其他有效数值替换。 %~ 语法被一个有效参数号码终止。%~ 修定符不能跟 %*使用 注意:参数扩充时不理会参数所代表的文件是否真实存在,均以当前目录进行扩展
要理解上面的知识,下面的例子很关键。
例: @echo off Echo 产生一个临时文件 > tmp.txt Rem 下行先保存当前目录,再将c:\windows设为当前目录 pushd c:\windows Call :sub tmp.txt Rem 下行恢复前次的当前目录 Popd Call :sub tmp.txt pause Del tmp.txt exit :sub Echo 删除引号: %~1 Echo 扩充到路径: %~f1 Echo 扩充到一个驱动器号: %~d1 Echo 扩充到一个路径: %~p1 Echo 扩充到一个文件名: %~n1 Echo 扩充到一个文件扩展名: %~x1 Echo 扩充的路径指含有短名: %~s1 Echo 扩充到文件属性: %~a1 Echo 扩充到文件的日期/时间: %~t1 Echo 扩充到文件的大小: %~z1 Echo 扩展到驱动器号和路径:%~dp1 Echo 扩展到文件名和扩展名:%~nx1 Echo 扩展到类似 DIR 的输出行:%~ftza1 Echo. Goto :eof
例: set aa=123456 set cmdstr=echo %aa% echo %cmdstr% call %cmdstr% pause 本例中如果不用call,而直接运行%cmdstr%,将显示结果%aa%,而不是123456
14、shift 更改批处理文件中可替换参数的位置。
SHIFT [/n]
如果命令扩展名被启用,SHIFT 命令支持/n 命令行开关;该命令行开关告诉 命令从第 n 个参数开始移位;n 介于零和八之间。例如:
SHIFT /2
会将 %3 移位到 %2,将 %4 移位到 %3,等等;并且不影响 %0 和 %1。
枯燥的学习让人烦躁,休息一下,请看: ---------------- 神奇的“海底人” ---------------- 几十年来,高级生物在地球各大水域出现的传闻层出不穷,一些科学家推测,海底可能有高度文明的生物存在,即在海洋深处的某些地方可能生活着一些智力高度发达的生命体——“海底人”。在众多传闻之中,最令人惊奇的是1959年初,在波兰丁尼亚港发现的海底人。当时他正筋疲力尽地走在沙滩上,人们把他送到附近的学校医院进行治疗时,发现这古怪的病人穿着没有开口的金属衣裳,此人的手指和脚趾与普通人不同,他的血液循环系统和器官并非人类所有。当人们打算对他进一步研究时,这个怪人突然之间杳如黄鹤,一去不复返。
————选自《世界未解之谜》
15、IF
IF 条件判断语句,语法格式如下:
IF [NOT] ERRORLEVEL number command IF [NOT] string1==string2 command IF [NOT] EXIST filename command
下面逐一介绍,更详细的分析请看后面章节。
(1) IF [NOT] ERRORLEVEL number command IF ERRORLEVEL这个句子必须放在某一个命令的后面,执行命令后由IF ERRORLEVEL 来判断命令的返回值。 Number的数字取值范围0~255,判断时值的排列顺序应该由大到小。返回的值大于等于指定的值时,条件成立
例: @echo off dir c: rem退出代码为>=1就跳至标题1处执行,>=0就跳至标题0处执行 IF ERRORLEVEL 1 goto 1 IF ERRORLEVEL 0 goto 0 Rem 上面的两行不可交换位置,否则失败了也显示成功。 :0 echo 命令执行成功! Rem 程序执行完毕跳至标题exit处退出 goto exit :1 echo 命令执行失败! Rem 程序执行完毕跳至标题exit处退出 goto exit :exit pause 运行显示:命令执行成功!
(2) IF [NOT] string1==string2 command string1和string2都为字符的数据,英文内字符的大小写将看作不同,这个条件中的等于号必须是两个(绝对相等的意思),条件成立即执行后面的command
检测当前变量的值做出判断,为了防止字符串中含有空格,可用以下格式 if [NOT] {string1}=={string2} command if [NOT] [string1]==[string2] command if [NOT] "string1"=="string2" command
这种写法实际上将括号或引号当成字符串的一部分了,只要等号左右两边一致就行了,比如下面的写法就不行: if {string1}==[string2] command
(3) IF [NOT] EXIST filename command EXIST filename为文件或目录存在的意思
echo off IF EXIST autoexec.bat echo 文件存在! IF not EXIST autoexec.bat echo 文件不存在!
这个批处理大家可以放在C盘和D盘分别执行,看看效果
16、setlocal 与 变量延迟
本条内容引用[英雄出品]的批处理教程:
要想进阶,变量延迟是必过的一关!所以这一部分希望你能认真看。
为了更好的说明问题,我们先引入一个例子。 例1: @echo off set a=4 set a=5 & echo %a% pause 结果:4 解说:为什么是4而不是5呢?在echo之前明明已经把变量a的值改成5了?
让我们先了解一下批处理运行命令的机制:
批处理读取命令时是按行读取的(另外例如for命令等,其后用一对圆括号闭合的所有语句也当作一行),在读取某行命令时,如果其中有变量,则变量值应该取上一行的值。所以在读取命令“set a=5 & echo %a%”时,dos将其预处理为“set a=5 & echo 4”,然后执行。而其中的a=5所做的数值变更,只能在下一命令行才能体现了。
而为了能够及时感知环境变量的动态变化,批处理设计了变量延迟。简单来说,在读取了一条完整的语句之后,不立即对该行的变量赋值,而会在某个单条语句执行之前再进行赋值,也就是说“延迟”了对变量的赋值。
那么如何开启变量延迟呢?变量延迟又需要注意什么呢?举个例子说明一下:
例2: @echo off setlocal enabledelayedexpansion set a=4 set a=5 & echo !a! pause 结果:5 解说:启动了变量延迟,得到了正确答案。变量延迟的启动语句是“setlocal enabledelayedexpansion”,并且变量要用一对叹号“!!”括起来(注意要用英文的叹号),否则就没有变量延迟的效果。
分析一下例2,首先“setlocal enabledelayedexpansion”开启变量延迟,然后“set a=4”先给变量a赋值为4,“set a=5 & echo !a!”这句是给变量a赋值为5并输出(由于启动了变量延迟,所以批处理能够感知到动态变化,即不是先给该行变量赋值,而是在运行过程中给变量赋值,因此此时a的值就是5了)。
再举一个例子巩固一下。 例3: @echo off setlocal enabledelayedexpansion for /l %%i in (1,1,5) do ( set a=%%i echo !a! ) pause
结果: 1 2 3 4 5 解说:本例开启了变量延迟并用“!!”将变量扩起来,因此得到我们预期的结果。如果不用变量延迟会出现什么结果呢?结果是这样的: ECHO 处于关闭状态。 ECHO 处于关闭状态。 ECHO 处于关闭状态。 ECHO 处于关闭状态。 ECHO 处于关闭状态。 即没有感知到for语句中的动态变化。
提示:在没有开启变量延迟的情况下,某条命令行中的变量改变,必须到下一条命令才能体现。这一点也可以加以利用,看例子。
例4:交换两个变量的值,且不用中间变量
@echo off ::交换两个变量的值,但是不使用临时变量 set var1=abc set var2=123 echo 交换前: var1=%var1% var2=%var2% set var1=%var2%& set var2=%var1% echo 交换后: var1=%var1% var2=%var2% pause
运行显示:
交换前: var1=abc var2=123 交换后: var1=123 var2=abc 请按任意键继续. . .
在代码中,使用 setlocal enabledelayedexpansion 语句来启用变量延迟之后,有得有失:
优点:
(a)、可以在同一语句内部直接使用上一次改变后的变量; (b)、在echo特殊字符的时候,无须用引号括起来,比如变量的值含有<、>、|等字符的时候,直接使用 echo !str! 就可以了;
缺点:
(a)、会把文本中所有的感叹号抛弃; (b)、增加代码的复杂度,有时容易出错。
17、ATTRIB 显示或更改文件属性
ATTRIB [+R|-R] [+A|-A] [+S|-S] [+H|-H] [[drive:] [path] filename] [/S [/D]]
+ 设置属性。 - 清除属性。 R 只读文件属性。 A 存档文件属性。 S 系统文件属性。 H 隐藏文件属性。 [drive:][path][filename] 指定要处理的文件属性。 /S 处理当前文件夹及其子文件夹中的匹配文件。 /D 也处理文件夹。
例: md autorun attrib +a +s +h autorun 上面的命令将建立文件夹autorun,然后将其设为存档、系统、隐藏属性
18、findstr 在文件中搜索字符串(find增强版)
find命令不能处理文件中超过1024个字符的数据行,此时可用findstr命令。
FINDSTR [/B] [/E] [/L] [/R] [/S] [/I] [/X] [/V] [/N] [/M] [/O] [/F:file] [/C:string] [/G:file] [/D:dir list] [/A:color attributes] [/OFF[LINE]] strings [[drive:][path]filename[ ...]]
/B 在一行的开始配对模式。 /E 在一行的结尾配对模式。 /L 按字使用搜索字符串。 /R 将搜索字符串作为一般表达式使用。 /S 在当前目录和所有子目录中搜索 匹配文件。 /I 指定搜索不分大小写。 /X 打印完全匹配的行。 /V 只打印不包含匹配的行。 /N 在匹配的每行前打印行数。 /M 如果文件含有匹配项,只打印其文件名。 /O 在每个匹配行前打印字符偏移量。 /P 忽略有不可打印字符的文件。 /OFF[LINE] 不跳过带有脱机属性集的文件。 /A:attr 指定有十六进位数字的颜色属性。请见 "color /?" /F:file 从指定文件读文件列表 (/ 代表控制台)。 /C:string 使用指定字符串作为文字搜索字符串。 /G:file 从指定的文件获得搜索字符串。 (/ 代表控制台)。 /D:dir 查找以分号为分隔符的目录列表 strings 要查找的文字。 [drive:][path]filename 指定要查找的文件。
除非参数有 /C 前缀,请使用空格隔开搜索字符串。 例如: 'FINDSTR "hello there" x.y' 在文件 x.y 中寻找 "hello" 或 "there" 。 'FINDSTR /C:"hello there" x.y' 文件 x.y 寻找 "hello there"。
一般表达式的快速参考: . 通配符: 任何字符 * 重复: 以前字符或类别出现零或零以上次数 ^ 行位置: 行的开始 $ 行位置: 行的终点 [class] 字符类别: 任何在字符集中的字符 [^class] 补字符类别: 任何不在字符集中的字符 [x-y] 范围: 在指定范围内的任何字符 \x Escape: 元字符 x 的文字用法 \<xyz 字位置: 字的开始 xyz\> 字位置: 字的结束
有关 FINDSTR 常见表达法的详细情况,请见联机命令参考。
大自然中的很多神奇现象令人惊叹不已: ---------------------------- 神奇的龙卷风 ---------------------------- 龙卷风外貌奇特,它上部是一块乌黑或浓灰的积雨云,下部是下垂着的形如大象鼻子的漏斗状云柱,具有小、快、猛、短的特点。龙卷风通常是极其迅速的,风速一般每秒50米至100米,有时可达每秒300米,甚至超过声速(340米/秒)。它像一个巨大的吸尘器,经过地面,地面的一切都要被它卷走;经过水库、河流,常卷起冲天水柱,有时连水库、河流的底部都露了出来。同时,龙卷风维持时间一般很短,往往只有几分钟或几十分钟,最多几小时,一般移动10米到10千米,便“寿终正寝”了。龙卷风还有一些“古怪行为”,使人难以捉摸。它席卷城镇,捣毁房屋,把碗橱从一个地方刮到另一个地方,却没有打碎碗橱里的一个碗;吓呆了的人们常常被它抬向高空,然后又被它平平安安地送回地面;有时它拔去一只鸡一侧的毛,而另一侧却完好无损;它将百年古松吹倒并拧成麻花状,而近旁的小杨树连一根枝条都未受到折损。人们对龙卷风的形成及后果进行了多年的研究,但还有很多谜底没有被揭开。 ————选自《世界未解之谜》
19、date /t 和 time /t
date /t 直接显示当前日期,可用来提取或显示日期。
time /t 直接显示当前时间,可用来提取或显示时间。
第二节 常用特殊符号
1、@ 命令行回显屏蔽符 2、% 批处理变量引导符 3、> 输出重定向符 4、>> 输出重定向符 5、<、>&、<& 重定向符 6、| 命令管道符 7、^ 转义字符 8、& 组合命令(顺序执行) 9、&& 组合命令(前面指令成功,才执行后面指令) 10、|| 组合命令(前面指令失败,才执行后面指令) 11、"" 字符串界定符 12、, 逗号 13、; 分号 14、() 括号 15、! 感叹号 16、批处理中可能会见到的其它特殊标记符: (略) CR(0D) 命令行结束符 Escape(1B) ANSI转义字符引导符 Space(20) 常用的参数界定符 Tab(09) ; = 不常用的参数界定符 + COPY命令文件连接符 * ? 文件通配符 / 参数开关引导符 : 批处理标签引导符
废话少说,开讲了
1、@ 命令行回显屏蔽符
这个字符在批处理中的意思是关闭当前行的回显。我们从前几课知道 ECHO OFF可以关闭掉整个批处理命令的回显,但不能关掉ECHO OFF这个命令,现在我们在ECHO OFF这个命令前加个@,就可以达到所有命令均不回显的要求
2、% 批处理变量引导符
这个百分号严格来说是算不上命令的,它只是批处理中的参数而已(多个%一起使用的情况除外,以后还将详细介绍)。 引用变量用%var%,调用程序外部参数用%1至%9等等 %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %*为命令行传递给批处理的参数 %0 批处理文件本身,包括完整的路径和扩展名 %1 第一个参数 %9 第九个参数 %* 从第一个参数开始的所有参数 参数%0具有特殊的功能,可以调用批处理自身,以达到批处理本身循环的目的,也可以复制和删除文件自身等等。
例:最简单的复制文件自身的方法 copy %0 d:\wind.bat
小技巧:添加行内注释 %注释内容%(可以用作行内注释,不能出现重定向符号和管道符号) 为什么这样呢?此时“注释内容”其实被当作变量,其值是空的,故只起注释作用,不过这种用法容易出现语法错误,一般不用。
3、> 输出重定向符 输出重定向命令 这个字符的意思是传递并且覆盖,他所起的作用是将运行的结果传递到后面的范围(后边可以是文件,也可以是默认的系统控制台) 在NT系列命令行中,重定向的作用范围由整个命令行转变为单个命令语句,受到了命令分隔符&,&&,||和语句块的制约限制。
比如: 使用命令:echo hello >1.txt将建立文件1.txt,内容为”hello “(注意行尾有一空格) 使用命令:echo hello>1.txt将建立文件1.txt,内容为”hello“(注意行尾没有空格)
4、>> 输出重定向符 输出重定向命令 这个符号的作用和>有点类似,但他们的区别是>>是传递并在文件的末尾追加,而>是覆盖
用法同上
同样拿1.txt做例子
使用命令: echo hello > 1.txt echo world >>1.txt
这时候1.txt 内容如下: hello world
5、<、>&、<& 重定向符
这三个命令也是管道命令,但>&、<&一般不常用,你只需要知道一下就ok了,当然如果想仔细研究的话,可以自己查一下资料。(本人已查过,网上也查不到相关资料)
<,输入重定向命令,从文件中读入命令输入,而不是从键盘中读入。 @echo off echo 2005-05-01>temp.txt set /p today=<temp.txt echo %today% del temp.txt pause 运行显示: 2005-05-01 请按任意键继续. . .
>&,将一个句柄的输出写入到另一个句柄的输入中。 <&,刚好和>&相反,从一个句柄读取输入并将其写入到另一个句柄输出中。
常用句柄:0、1、2,未定义句柄:3—9 1>nul 表示禁止输出正确的信息 2>nul 表示禁止输出错误信息。 其中的1与2都是代表某个数据流输入输出的地址(NT CMD 称之为句柄,MSDOS称之为设备)。
句柄0:标准输入stdin,键盘输入 句柄1:标准输出stdout,输出到命令提示符窗口(console,代码为CON) 句柄2:标准错误stderr,输出到命令提示符窗口(console,代码为CON) 其中的stdin可被<重定向,stdout可被>、>>重定向。
我们已经知道读取文本中的内容可以用for命令,但如果只需要读取第一行用for命令就有点麻烦。简单的办法如下: @echo off set /p str=<%0 echo %str% pause 运行显示批处理文件自身的第一行:@echo off
---------------------------- 行踪诡秘的球状闪电 ---------------------------- 球状闪电是一种非常奇特的现象。一般闪电都是呈枝条状,球状闪电则呈圆球状;一般闪电只能存在百分之几秒,最多不超过几秒,而球状闪电却能存在好几分钟;一般闪电有固定的路径,球状闪电却能像幽灵般的四处飘荡,游移不定。它到底是怎么形成的呢?科学界对此尚无定论。球状闪电的颜色各种各样,有的橘红,有的淡红,有的闪着蓝白色的光,有的冒着紫色的火星。它们的行踪十分诡秘。1984年,一架前苏联运输机与球状闪电在空中相遇,它竟然能穿透金属机身来到机舱内,并分裂成两个半圆形,最后两个半圆又合而为一,消失在空气中。 ————选自《世界未解之谜》
6、| 命令管道符
格式:第一条命令 | 第二条命令 [| 第三条命令...] 将第一条命令的结果作为第二条命令的参数来使用,记得在unix中这种方式很常见。
例如:
dir c:\|find "txt"
以上命令是:查找C:\所有,并发现TXT字符串。 FIND的功能请用 FIND /? 自行查看
在不使format的自动格式化参数时,我是这样来自动格式化A盘的
echo y|format a: /s /q /v:system
用过format的都知道,再格盘时要输入y来确认是否格盘,这个命令前加上echo y并用|字符来将echo y的结果传给format命令
从而达到自动输入y的目的
(这条命令有危害性,测试时请慎重)
7、^ 转义字符
^是对特殊符号<,>,&的前导字符,在命令中他将以上3个符号的特殊功能去掉,仅仅只把他们当成符号而不使用他们的特殊意义。
比如
echo test ^>1.txt
结果则是:test > 1.txt
他没有追加在1.txt里,呵呵。只是显示了出来
另外,此转义字符还可以用作续行符号。 举个简单的例子: @echo off echo 英雄^ 是^ 好^ 男人 pause
不用多说,自己试一下就明白了。
为什么转义字符放在行尾可以起到续行符的作用呢?原因很简单,因为每行末尾还有一个看不见的符号,即回车符,转义字符位于行尾时就让回车符失效了,从而起到了续行的作用。
8、& 组合命令(顺序执行)
语法:第一条命令 & 第二条命令 [& 第三条命令...] &、&&、||为组合命令,顾名思义,就是可以把多个命令组合起来当一个命令来执行。这在批处理脚本里是允许的,而且用的非常广泛。因为批处理认行不认命令数目。
这个符号允许在一行中使用2个以上不同的命令,当第一个命令执行失败了,也不影响后边的命令执行。 这里&两边的命令是顺序执行的,从前往后执行。 比如:
dir z:\ & dir y:\ & dir c:\
以上命令会连续显示z,y,c盘的内容,不理会该盘是否存在
9、&& 组合命令(前面指令成功,才执行后面指令) 语法:第一条命令 && 第二条命令 [&& 第三条命令...]
用这种方法可以同时执行多条命令,当碰到执行出错的命令后将不执行后面的命令,如果一直没有出错则一直执行完所有命令 这个命令和上边的类似,但区别是,第一个命令失败时,后边的命令也不会执行
dir z:\ && dir y:\ && dir c:\
10、|| 组合命令(前面指令失败,才执行后面指令)
语法:第一条命令 || 第二条命令 [|| 第三条命令...]
用这种方法可以同时执行多条命令,当一条命令失败后才执行第二条命令,当碰到执行正确的命令后将不执行后面的命令,如果没有出现正确的命令则一直执行完所有命令;
提示:组合命令和重定向命令一起使用必须注意优先级 管道命令的优先级高于重定向命令,重定向命令的优先级高于组合命令
问题:把C盘和D盘的文件和文件夹列出到a.txt文件中。看例: dir c:\ && dir d:\ > a.txt
这样执行后a.txt里只有D盘的信息!为什么?因为组合命令的优先级没有重定向命令的优先级高!所以这句在执行时将本行分成这两部分:dir c:\和dir d:\ > a.txt,而并不是如你想的这两部分:dir c:\ && dir d:\和> a.txt。要使用组合命令&&达到题目的要求,必须得这么写:
dir c:\ > a.txt && dir d:\ >> a.txt
这样,依据优先级高低,DOS将把这句话分成以下两部分:dir c:\ > a.txt和dir d:\ >> a.txt。例十八中的几句的差别比较特殊,值得好好研究体会一下。
当然这里还可以利用&命令(自己想一下道理哦):
dir c:\ > a.txt & dir d:\ >> a.txt
---------------------------- “行为”古怪的闪电 ---------------------------- 1892年7月19日,两个黑人在美国宾夕法尼亚州被闪电击毙,当时他们在公园的一棵树下躲雨。当人们从其中一人的身上脱下衣服时,看见了令人震惊的奇景:死者的前胸留下了闪电发生地点的影像,上边还有一片略带棕色的橡树叶以及藏在草中的羊齿草。树叶和羊齿草的图像如此清晰,连肉眼也能看见最细小的筋络。1957年,美国一位牧场女工在雷雨中工作。忽然巨雷一响,她虽未被劈死,但感到胸部作痛,解开上衣才发现,竟有一头牛的影像印在胸前。在俄罗斯,有一个人遭到雷击后, 全身上下的衣服都不见了,只剩下一只衬衫的袖子和几个皮靴上的铁钉,10分钟以后,他恢复了知觉,看到自己全身一丝不挂,感到非常奇怪。闪电所造成的这些奇怪现象该如何解释呢? ————选自《世界未解之谜》
11、"" 字符串界定符
双引号允许在字符串中包含空格,进入一个特殊目录可以用如下方法
cd "program files" cd progra~1 cd pro*
以上三种方法都可以进入program files这个目录
12、, 逗号
逗号相当于空格,在某些情况下“,”可以用来当做空格使
比如 dir,c:\
13、; 分号
分号,当命令相同时,可以将不同目标用;来隔离,但执行效果不变,如执行过程中发生错误,则只返回错误报告,但程序仍会执行。(有人说不会继续执行,其实测试一下就知道了)
比如: dir c:\;d:\;e:\;z:\
以上命令相当于 dir c:\ dir d:\ dir e:\ dir f:\ 如果其中z盘不存在,运行显示:系统找不到指定的路径。然后终止命令的执行。
例:dir c:\;d:\;e:\1.txt 以上命令相当于 dir c:\ dir d:\ dir e:\1.txt 其中文件e:\1.txt不存在,但e盘存在,有错误提示,但命令仍会执行。
为什么?如果目标路径不存在,则终止执行;如果路径存在,仅文件不存在,则继续执行。
就说这些了!各位有什么意见请回贴!有什么疑问请到BAT交流区发贴!下一节改进!
14、() 括号
小括号在批处理编程中有特殊的作用,左右括号必须成对使用,括号中可以包括多行命令,这些命令将被看成一个整体,视为一条命令行。 括号在for语句和if语句中常见,用来嵌套使用循环或条件语句,其实括号()也可以单独使用,请看例子。 例: 命令:echo 1 & echo 2 & echo 3 可以写成: ( echo 1 echo 2 echo 3 ) 上面两种写法效果一样,这两种写法都被视为是一条命令行。 注意:这种多条命令被视为一条命令行时,如果其中有变量,就涉及到变量延迟的问题。
15、! 感叹号 没啥说的,在变量延迟问题中,用来表示变量,即%var%应该表示为!var!,请看前面的setlocal命令介绍。
累了,换换思维,有兴趣的可以学一段古文化:《三字经》第一节,可谓人人皆知。 【原文】 人(rén) 之(zhī) 初(chū),性(xìng) 本(běn) 善(shàn), 性(xìng) 相(xiāng) 近(jìn),习(xí) 相(xiāng) 远(yuǎn)。 苟(gǒu) 不(bú) 教(jiào),性(xìng) 乃(nǎi) 迁(qiān), 教(jiào) 之(zhī) 道(dào),贵(guì) 以(yǐ) 专(zhuān)。 【译文参考】 人刚生下来的时候,本性中有善的一面。这时候善良的本性,大致都很相近,没有多大的差别。等到长大以后,因各人的环境不同,所学习的也不同;在好的环境人就会变好,在不好的环境人就容易学坏,于是性情开始有了差别。假如在这个时候,不给他适当的教导,学了种种不良的习惯,他原本善良的本性,就会渐渐变坏;而教导的方法,最重要的就是必须专心一致,不可边做边停,才能使他有完整的学习。
第二章 DOS循环:for命令详解
讲FOR之前呢,咋先告诉各位新手朋友,如果你有什么命令不懂,直接在CMD下面输入: name /? 这样的格式来看系统给出的帮助文件,比如for /? 就会把FOR命令的帮助全部显示出来!当然许多菜鸟都看不懂.... 所以才会有那么多批处理文章! 俺也照顾菜鸟,把FOR命令用我自己的方式说明下!
正式开始:
一、基本格式
FOR %%variable IN (set) DO command [command-parameters]
%%variable 指定一个单一字母表示可替换的参数。 (set) 指定一个或一组文件。可以使用通配符。 command 指定对每个文件执行的命令。 command-parameters 为特定命令指定参数或命令行开关。
参数:FOR有4个参数 /d /l /r /f 他们的作用我在下面用例子解释 现在开始讲每个参数的意思
二、参数 /d 主要搜索匹配目录 FOR /D %%variable IN (set) DO command [command-parameters] 如果集中包含通配符,则指定与目录名匹配,而不与文件 名匹配。
如果 Set (也就是我上面写的 "相关文件或命令") 包含通配符(* 和 ?),将对与 Set 相匹配的每个目录(而不是指定目录中的文件组)执行指定的 Command。
这个参数主要用于目录搜索,不会搜索文件,看这样的例子
@echo off for /d %%i in (c:\*) do echo %%i pause
运行会把C盘根目录下的全部目录名字打印出来,而文件名字一个也不显示!
在来一个,比如我们要把当前路径下文件夹的名字只有1-3个字母的打出来 @echo off for /d %%i in (???) do echo %%i pause 这样的话如果你当前目录下有目录名字只有1-3个字母的,就会显示出来,没有就不显示了
这里解释下*号和?号的作用,*号表示任意N个字符,而?号只表示任意一个字符
知道作用了,给大家个思考题目!
@echo off for /d %%i in (window?) do echo %%i pause 保存到C盘下执行,会显示什么呢?自己看吧! 显示:windows /D参数只能显示当前目录下的目录名字,这个大家要注意!
三、参数 /R 搜索指定目录树中的匹配文件
FOR /R [[drive:]path] %%variable IN (set) DO command [command-parameters]
检查以 [drive:]path 为根的目录树,指向每个目录中的 FOR 语句。如果在 /R 后没有指定目录,则使用当前 目录。如果集仅为一个单点(.)字符,则枚举该目录树。
递归
上面我们知道,/D只能显示当前路径下的目录名字,那么现在这个/R也是和目录有关,他能干嘛呢?放心他比/D强大多了! 他可以把当前或者你指定路径下的文件名字全部读取,注意是文件名字,有什么用看例子!
*****************************请注意2点:
1、set中的文件名如果含有通配符(?或*),则列举/R参数指定的目录及其下面的所用子目录中与set相符合的所有文件,无相符文件的目录则不列举。如果目录树中没有相符的文件,或者指定的目录根本不存在,这两种情况下均不会列举目录。 2、相反,如果set中为具体文件名(即不含通配符?和*),则枚举该目录树(即列举该目录及其下面的所有子目录),而不管set中的指定文件是否存在,也就是说,此时不但列举含有指定文件的目录,也要列举不含指定文件的其它所有目录。这与前面所说的单点(.)枚举目录树是一个道理,单点代表当前目录,也可视为一个文件。此时哪怕指定的目录根本不存在,同样会列举目录。 比如:for /r M:\不存在 %%i in (1.exe) do echo %%i 运行显示:M:\不存在\1.exe ***************************** 例:
@echo off for /r c:\ %%i in (*.exe) do echo %%i pause
咱们把这个BAT保存到D盘随便哪里然后执行,我会就会看到,他把C盘根目录,和每个目录的子目录下面全部的EXE文件都列出来了!!!!没有exe文件的目录则不列举。
例: @echo off for /r %%i in (*.exe) do echo %%i pause 参数不一样了吧!这个命令前面没加那个C:\也就是搜索路径,这样他就会以当前目录为搜索路径,比如你这个BAT你把他放在d:\test目录下执行,那么他就会把D:\test目录和他下面的子目录的全部EXE文件列出来!!!
例: @echo off for /r c:\ %%i in (boot.ini) do echo %%i pause 运行本例发现枚举了c盘所有目录。
为了只列举boot.ini存在的目录,可改成下面这样: @echo off for /r c:\ %%i in (boot.ini) do if exist %%i echo %%i pause 用这条命令搜索文件真不错。。。。。。
这个参数大家应该理解了吧!还是满好玩的命令!
四、参数 /L 按数字序列(start,step,end)循环
FOR /L %%variable IN (start,step,end) DO command [command-parameters]
该集表示以增量形式从开始到结束的一个数字序列。 因此,(1,1,5) 将产生序列 1 2 3 4 5,(5,-1,1) 将产生 序列 (5 4 3 2 1)。
使用迭代变量设置起始值 (Start#),然后逐步执行一组范围的值,直到该值超过所设置的终止值 (End#)。/L 将通过对 Start# 与 End# 进行比较来执行迭代变量。如果 Start# 小于 End#,就会执行该命令。如果迭代变量超过 End#,则命令解释程序退出此循环。还可以使用负的 Step# 以递减数值的方式逐步执行此范围内的值。例如,(1,1,5) 生成序列 1 2 3 4 5,而 (5,-1,1) 则生成序列 (5 4 3 2 1)。语法是:
看着这说明有点晕吧!咱们看例子就不晕了!
@echo off for /l %%i in (1,1,5) do @echo %%i pause 保存执行看效果,他会打印从1 2 3 4 5 这样5个数字 (1,1,5)这个参数也就是表示从1开始每次加1直到5终止!
等会晕,就打印个数字有P用...好的满足大家,看这个例子 @echo off for /l %%i in (1,1,5) do start cmd pause 执行后是不是吓了一跳,怎么多了5个CMD窗口,呵呵!如果把那个 (1,1,5)改成 (1,1,65535)会有什么结果,我先告诉大家,会打开65535个CMD窗口....这么多你不死机算你强! 当然我们也可以把那个start cmd改成md %%i 这样就会建立指定个目录了!!!名字为1-65535
看完这个被我赋予破坏性质的参数后,我们来看最后一个参数
---------------------------- 三叶虫化石 ---------------------------- 1968年,一个三叶虫化石的收藏家在犹他州旅行时,发现了让他惊喜不已的三叶虫化石。我们知道,三叶虫是一种生存在5亿年前的小生物。可他回家后,竟在这个化石上看见了人类的脚印,那是一个穿着凉鞋的脚印,不偏不倚正好踩在三叶虫上。它不会是人为的恶作剧吧?开始也有人是这么想的,但是如果要制作这些脚印并把它们刻在石头上,再埋在深深的土层里,还要做到不留痕迹,这似乎完全没有可能。而且就在这之后,又先后有人在同一地区发现了类似的多处脚印,要伪造这么多脚印且都做到人不知鬼不觉是不可能的,可惜的是人们依然无法确定这些鞋印是怎么回事。按照达尔文进化论,在遥远的5亿年前,连人类的近亲猩猩、猴子都没有,谁会穿着凉鞋在这一带溜达呢? ————选自《世界未解之谜》
五、参数 /F 处理命令输出、字符串及文件内容
\迭代及文件解析 使用文件解析来处理命令输出、字符串及文件内容。使用迭代变量定义要检查的内容或字符串,并使用各种options选项进一步修改解析方式。使用options令牌选项指定哪些令牌应该作为迭代变量传递。请注意:在没有使用令牌选项时,/F 将只检查第一个令牌。 文件解析过程包括读取输出、字符串或文件内容,将其分成独立的文本行以及再将每行解析成零个或更多个令牌。然后通过设置为令牌的迭代变量值,调用 for 循环。默认情况下,/F 传递每个文件每一行的第一个空白分隔符号。跳过空行。
详细的帮助格式为: FOR /F ["options"] %%variable IN (file-set) DO command [command-parameters] FOR /F ["options"] %%variable IN ("string") DO command [command-parameters] FOR /F ["options"] %%variable IN ('command') DO command [command-parameters]
带引号的字符串"options"包括一个或多个 指定不同解析选项的关键字。这些关键字为:
eol=c - 指一个行注释字符的结尾(就一个) skip=n - 指在文件开始时忽略的行数。 delims=xxx - 指分隔符集。这个替换了空格和跳格键的 默认分隔符集。 tokens=x,y,m-n - 指每行的哪一个符号被传递到每个迭代 的 for 本身。这会导致额外变量名称的分配。m-n 格式为一个范围。通过 nth 符号指定 mth。如果 符号字符串中的最后一个字符星号, 那么额外的变量将在最后一个符号解析之后 分配并接受行的保留文本。经测试,该参数最多 只能区分31个字段。
usebackq - 使用后引号(键盘上数字1左面的那个键`)。
未使用参数usebackq时:file-set表示文件,但不能含有空格 双引号表示字符串,即"string" 单引号表示执行命令,即'command'
使用参数usebackq时:file-set和"file-set"都表示文件 当文件路径或名称中有空格时,就可以用双引号括起来 单引号表示字符串,即'string' 后引号表示命令执行,即`command`
以上是用for /?命令获得的帮助信息,直接复制过来的。 晕惨了!我这就举个例子帮助大家来理解这些参数!
For命令例1:**************************************** @echo off rem 首先建立临时文件test.txt echo ;注释行,这是临时文件,用完删除 >test.txt echo 11段 12段 13段 14段 15段 16段 >>test.txt echo 21段,22段,23段,24段,25段,26段 >>test.txt echo 31段-32段-33段-34段-35段-36段 >>test.txt FOR /F "eol=; tokens=1,3* delims=,- " %%i in (test.txt) do echo %%i %%j %%k Pause Del test.txt
运行显示结果:
11段 13段 14段 15段 16段 21段 23段 24段,25段,26段 31段 33段 34段-35段-36段 请按任意键继续. . .
为什么会这样?我来解释: eol=; 分号开头的行为注释行 tokens=1,3* 将每行第1段,第3段和剩余字段分别赋予变量%%i,%%j,%%k delims=,- (减号后有一空格)以逗号减号和空格为分隔符,空格必须放在最后
For命令例2:**************************************** @echo off FOR /F "eol= delims=" %%i in (test.txt) do echo %%i Pause
运行将显示test.txt全部内容,包括注释行,不解释了哈。
For命令例3:****************************************
另外/F参数还可以以输出命令的结果看这个例子
@echo off FOR /F "delims=" %%i in ('net user') do @echo %%i pause
这样你本机全部帐号名字就出来了把扩号内的内容用两个单引号引起来就表示那个当命令执行,FOR会返回命令的每行结果,加那个"delims=" 是为了让我空格的行能整行显示出来,不加就只显示空格左边一列!
基本上讲完了FOR的基本用法了...如果你看过FOR的系统帮助,你会发现他下面还有一些特定义的变量,这些我先不讲.大家因该都累了吧!你不累我累啊....
所谓文武之道,一张一弛,现休息一下。
第三章 FOR命令中的变量
FOR命令中有一些变量,他们的用法许多新手朋友还不太了解,今天给大家讲解他们的用法!
先把FOR的变量全部列出来: ~I - 删除任何引号("),扩展 %I %~fI - 将 %I 扩展到一个完全合格的路径名 %~dI - 仅将 %I 扩展到一个驱动器号 %~pI - 仅将 %I 扩展到一个路径 %~nI - 仅将 %I 扩展到一个文件名 %~xI - 仅将 %I 扩展到一个文件扩展名 %~sI - 扩展的路径只含有短名 %~aI - 将 %I 扩展到文件的文件属性 %~tI - 将 %I 扩展到文件的日期/时间 %~zI - 将 %I 扩展到文件的大小 %~$PATH:I - 查找列在路径环境变量的目录,并将 %I 扩展 到找到的第一个完全合格的名称。如果环境变量名 未被定义,或者没有找到文件,此组合键会扩展到 空字符串
我们可以看到每行都有一个大写字母"I",这个I其实就是我们在FOR带入的变量,我们FOR语句代入的变量名是什么,这里就写什么. 比如:FOR /F %%z IN ('set') DO @echo %%z 这里我们代入的变量名是z那么我们就要把那个I改成z,例如%~fI改为%~fz 至于前面的%~p这样的内容就是语法了!
好开始讲解:
一、 ~I - 删除任何引号("),扩展 %I
这个变量的作用就如他的说明,删除引号! 我们来看这个例子: 首先建立临时文件temp.txt,内容如下 "1111 "2222" 3333" "4444"44 "55"55"55
可建立个BAT文件代码如下:
@echo off echo ^"1111>temp.txt echo "2222">>temp.txt echo 3333^">>temp.txt echo "4444"44>>temp.txt echo ^"55"55"55>>temp.txt rem 上面建立临时文件,注意不成对的引号要加转义字符^,重定向符号前不要留空格 FOR /F "delims=" %%i IN (temp.txt) DO echo %%~i pause del temp.txt 执行后,我们看CMD的回显如下: 1111 #字符串前的引号被删除了 2222 #字符串首尾的引号都被删除了 3333" #字符串前无引号,后面的引号保留 4444"44 #字符串前面的引号删除了,而中间的引号保留 55"55"55 #字符串前面的引号删除了,而中间的引号保留 请按任意键继续. . .
和之前temp.txt中的内容对比一下,我们会发现第1、2、5行的引号都消失了,这就是删除引号~i的作用了! 删除引号规则如下(BAT兄补充!) 1、若字符串首尾同时存在引号,则删除首尾的引号; 2、若字符串尾不存在引号,则删除字符串首的引号; 3、如果字符串中间存在引号,或者只在尾部存在引号,则不删除。
龙卷风补充:无头不删,有头连尾删。
二、 %~fI - 将 %I 扩展到一个完全合格的路径名
看例子: 把代码保存放在随便哪个地方,我这里就放桌面吧. FOR /F "delims==" %%i IN ('dir /b') DO @echo %%~fi pause
执行后显示内容如下 C:\Documents and Settings\Administrator\桌面\test.bat C:\Documents and Settings\Administrator\桌面\test.vbs 当我把代码中的 %%~fi直接改成%%i FOR /F "delims==" %%i IN ('dir /b') DO @echo %%i pause
执行后就会显示以下内容: test.bat test.vbs
通过对比,我们很容易就看出没有路径了,这就是"将 %I 扩展到一个完全合格的路径名"的作用 也就是如果%i变量的内容是一个文件名的话,他就会把这个文件所在的绝对路径打印出来,而不只单单打印一个文件名,自己动手动实验下就知道了!
三、 %~dI - 仅将 %I 扩展到一个驱动器号
看例子: 代码如下,我还是放到桌面执行! FOR /F "delims==" %%i IN ('dir /b') DO @echo %%~di pause 执行后我CMD里显示如下 C: C: 我桌面就两个文件test.bat,test.vbs,%%~di作用是,如果变量%%i的内容是一个文件或者目录名,他就会把他这文件 或者目录所在的盘符号打印出来!
四、 %~pI - 仅将 %I 扩展到一个路径
这个用法和上面一样,他只打印路径不打印文件名字 FOR /F "delims==" %%i IN ('dir /b') DO @echo %%~pi pause
我就不打结果了,大家自己复制代码看结果吧,下面几个都是这么个用法,代码给出来,大家自己看结果吧!
五、 %~nI - 仅将 %I 扩展到一个文件名 只打印文件名字 FOR /F "delims==" %%i IN ('dir /b') DO @echo %%~ni pause
六、 %~xI - 仅将 %I 扩展到一个文件扩展名 只打印文件的扩展名 FOR /F "delims==" %%i IN ('dir /b') DO @echo %%~xi pause
七、 %~sI - 扩展的路径只含有短名 打印绝对短文件名 FOR /F "delims==" %%i IN ('dir /b') DO @echo %%~si pause
八、 %~aI - 将 %I 扩展到文件的文件属性 打印文件的属性 FOR /F "delims==" %%i IN ('dir /b') DO @echo %%~ai pause
九、 %~tI - 将 %I 扩展到文件的日期/时间 打印文件建立的日期 FOR /F "delims==" %%i IN ('dir /b') DO @echo %%~ti pause
十、 %~zI - 将 %I 扩展到文件的大小 打印文件的大小 FOR /F "delims==" %%i IN ('dir /b') DO @echo %%~zi pause 上面例子中的"delims=="可以改为"delims=",即不要分隔符
十一、 %~$PATH:I - 查找列在路径环境变量的目录,并将 %I 扩展 到找到的第一个完全合格的名称。如果环境变量名 未被定义,或者没有找到文件,此组合键会扩展到 空字符串 这是最后一个,和上面那些都不一样,我单独说说!
然后在把这些代码保存为批处理,放在桌面。 @echo off FOR /F "delims=" %%i IN (“notepad.exe”) DO echo %%~$PATH:i pause
龙卷风补充:上面代码显示结果为C:\WINDOWS\system32\notepad.exe
他的意思就在PATH变量里指定的路径里搜索notepad.exe文件,如果有notepad.exe则会把他所在绝对路径打印出来,没有就打印一个错误!
好了,FOR的的变量就介绍到这了! BY 伤脑筋
好了,理科学习告一段落,请欣赏《千字文》第一节:
【原文】
天(tiān) 地(dì) 玄(xuán) 黄(huáng) ,
宇(yǔ) 宙(zhòu) 洪(hóng) 荒(huāng) 。
日(rì) 月(yuè) 盈(yíng) 昃(zè) ,
辰(chén) 宿(xiù) 列(liè) 张(zhāng) 。
(1)玄黄:形容在远古地球刚诞生时的景象,新的天体正在组成,天地之间一片浑沌炽热。天空因大气燃烧而赤黑又变化莫测,所以称之为“天玄”。大地因燃烧而变得焦黄,所以称之为“地黄”。玄,黑中带红的颜色,后来多指黑色;深远莫测的。黄,黄色,与红、蓝合称三原色。出自于《易经》:夫玄黄者,天地之杂也,天玄而地黄。
(2)宇宙:时空的总合。宇,上下四方无限广大的空间。宙,古往今来无限久远的时间。出自于《淮南子》:上下四方叫作宇,古往今来叫作宙。
(3)洪荒:远古时期地球有很大的面积以及很长一段时间被洪水所淹没,到处显得荒芜凄凉。洪,大;大水。荒,杂草丛生。出自于西汉? 杨雄《太玄经》:洪荒之世。
(4)盈:充满,此指月圆。月亮盈亏的变化,阴历每月十五日是满月,又称望月、盈月;三十日月尽,没有月光。
(5)昃:倾斜,指太阳西斜。太阳每天东升西落,早上从东边升起,正午时位置最高,过了正午向西边斜落。
(6)辰宿:星辰。辰:星体的总称。宿:星群、星座。单颗星体称星,一颗以上称宿。
(7)列张:陈列分布。列,陈列。张,分布。出自《淮南子》:天设日月,列星辰,调阴阳,张四时。
【译文参考】
在地球刚诞生的时候,地球的四周被浑沌不清、变幻莫测的赤黑色气体所包围,而大地则是枯黄的一片。到处都是大水,举目所见一片荒凉。
经过很长的一段时间后,天地之间慢慢澄清了,这时可以看到太阳、月亮很有规律的在天空中运行着,日出日落,月圆月缺。在无边无际的天空中布满了大大小小的星星。
第四章 批处理中的变量
批处理中的变量,我把他分为两类,分别为"系统变量"和"自定义变量"
我们现在来详解这两个变量!
一、系统变量
他们的值由系统将其根据事先定义的条件自动赋值,也就是这些变量系统已经给他们定义了值, 不需要我们来给他赋值,我们只需要调用而以! 我把他们全部列出来!
%ALLUSERSPROFILE% 本地 返回“所有用户”配置文件的位置。 %APPDATA% 本地 返回默认情况下应用程序存储数据的位置。 %CD% 本地 返回当前目录字符串。 %CMDCMDLINE% 本地 返回用来启动当前的 Cmd.exe 的准确命令行。 %CMDEXTVERSION% 系统 返回当前的“命令处理程序扩展”的版本号。 %COMPUTERNAME% 系统 返回计算机的名称。 %COMSPEC% 系统 返回命令行解释器可执行程序的准确路径。 %DATE% 系统 返回当前日期。使用与 date /t 命令相同的格式。由 Cmd.exe 生成。有关
date 命令的详细信息,请参阅 Date。 %ERRORLEVEL% 系统 返回上一条命令的错误代码。通常用非零值表示错误。 %HOMEDRIVE% 系统 返回连接到用户主目录的本地工作站驱动器号。基于主目录值而设置。用
户主目录是在“本地用户和组”中指定的。 %HOMEPATH% 系统 返回用户主目录的完整路径。基于主目录值而设置。用户主目录是在“本地用户和组”中指定的。
%HOMESHARE% 系统 返回用户的共享主目录的网络路径。基于主目录值而设置。用户主目录是
在“本地用户和组”中指定的。 %LOGONSERVER% 本地 返回验证当前登录会话的域控制器的名称。 %NUMBER_OF_PROCESSORS% 系统 指定安装在计算机上的处理器的数目。 %OS% 系统 返回操作系统名称。Windows 2000 显示其操作系统为 Windows_NT。 %PATH% 系统 指定可执行文件的搜索路径。 %PATHEXT% 系统 返回操作系统认为可执行的文件扩展名的列表。 %PROCESSOR_ARCHITECTURE% 系统 返回处理器的芯片体系结构。值:x86 或 IA64 基于
Itanium %PROCESSOR_IDENTFIER% 系统 返回处理器说明。 %PROCESSOR_LEVEL% 系统 返回计算机上安装的处理器的型号。 %PROCESSOR_REVISION% 系统 返回处理器的版本号。 %PROMPT% 本地 返回当前解释程序的命令提示符设置。由 Cmd.exe 生成。 %RANDOM% 系统 返回 0 到 32767 之间的任意十进制数字。由 Cmd.exe 生成。 %SYSTEMDRIVE% 系统 返回包含 Windows server operating system 根目录(即系统根目录)
的驱动器。 %SYSTEMROOT% 系统 返回 Windows server operating system 根目录的位置。 %TEMP% 和 %TMP% 系统和用户 返回对当前登录用户可用的应用程序所使用的默认临时目录。
有些应用程序需要 TEMP,而其他应用程序则需要 TMP。 %TIME% 系统 返回当前时间。使用与 time /t 命令相同的格式。由 Cmd.exe 生成。有关
time 命令的详细信息,请参阅 Time。 %USERDOMAIN% 本地 返回包含用户帐户的域的名称。 %USERNAME% 本地 返回当前登录的用户的名称。 %USERPROFILE% 本地 返回当前用户的配置文件的位置。 %WINDIR% 系统 返回操作系统目录的位置。
这么多系统变量,我们如何知道他的值是什么呢? 在CMD里输入 echo %WINDIR% 这样就能显示一个变量的值了!
举个实际例子,比如我们要复制文件到当前帐号的启动目录里就可以这样
copy d:\1.bat "%USERPROFILE%\「开始」菜单\程序\启动\"
%USERNAME% 本地 返回当前登录的用户的名称。 注意有空格的目录要用引号引起来
另外还有一些系统变量,他们是代表一个意思,或者一个操作!
他们分别是%0 %1 %2 %3 %4 %5 ......一直到%9 还有一个%*
%0 这个有点特殊,有几层意思,先讲%1-%9的意思.
%1 返回批处理的第一个参数 %2 返回批处理的第二个参数 %3-%9依此推类
反回批处理参数?到底怎么个返回法?
我们看这个例子,把下面的代码保存为test.BAT然后放到C盘下
@echo off echo %1 %2 %3 %4 echo %1 echo %2 echo %3 echo %4
进入CMD,输入cd c:\ 然后输入 test.bat 我是第一个参数 我是第二个参数 我是第三个参数 我是第四个参数
注意中间的空格,我们会看到这样的结果:
我是第一个参数 我是第二个参数 我是第三个参数 我是第四个参数 我是第一个参数 我是第二个参数 我是第三个参数 我是第四个参数
对比下代码,%1就是”我是第一个参数” %2就是”我是第二个参数” 怎么样理解了吧!
这些%1和%9可以让批处理也能带参数运行,大大提高批处理功能!
还有一个%* 他是什么呢?他的作用不是很大,只是返回参数而已,不过他是一次返回全部参数的值,不用在输入%1 %2来确定一个个的
例子 @echo off echo %*
同样保存为test.bat 放到C盘 进入CMD,输入cd c:\ 然后输入 test.bat 我是第一个参数 我是第二个参数 我是第三个参数 我是第四个参数
可以看到他一次把全部参数都显示出来了
好现在开始讲那个比较特殊的%0
%0 这个不是返回参数的值了,他有两层意思!
第一层意思:返回批处理所在绝对路径
例子: @echo off echo %0 pause
保存为test.BAT放在桌面运行,会显示如下结果 "C:\Documents and Settings\Administrator\桌面\test.bat"
他把当前批处理执行的所在路经打印出来了,这就是返回批处理所在绝对路径的意思
第二层意思:无限循环执行BAT
例子: @echo off net user %0
保存为BAT执行,他就会无限循环执行net user这条命令,直到你手动停止. 龙卷风补充:其实%0就是第一参数%1前面那个参数,当然就是批处理文件名(包括路径)。
以上就是批处理中的一些系统变量,另外还有一些变量,他们也表示一些功能, FOR命令中的那些就是,FOR变量已经说过,就不讲了.
二、自定义变量
故名思意,自定义变量就是由我们来给他赋予值的变量
要使用自定义变量就得使用set命令了,看例子.
@echo off set var=我是值 echo %var% pause
保存为BAT执行,我们会看到CMD里返回一个 "我是值"
var为变量名,=号右变的是要给变量的值 这就是最简单的一种设置变量的方法了
如果我们想让用户手工输入变量的值,而不是在代码里指定,可以用用set命令的/p参数
例子:
@echo off set /p var=请输入变量的值 echo %var% pause
var变量名 =号右边的是提示语,不是变量的值 变量的值由我们运行后自己用键盘输入!
好了批处理的变量先介绍到这,关于set命令,下次再写个专门的文章吧. by 伤脑筋
休息一下,看点其它的:
---------------------------- 临死时人会见到什么? ---------------------------- 由于医学的日渐发达,越来越多的病人有了“起死复生”的经历。他们从生命的虚无尽头走出来,重新投向洒满阳光的人世间,再次见到熟悉的亲人朋友,感慨自然很多。但在这些感慨中,有一些是他们临死时的亲见亲闻。我们尚且不要怀疑其真实性有多大,先来听听又何妨呢?毕竟他们对这些见闻有着深切的体验和真实的回忆。科学家对这个命题也极感兴趣,他们访问了很多有过“死亡经历”的人,将其见闻总结起来,进行归纳与分析,试图破解人类死亡之谜。统计数字中,大多数人都提到临死时有一种分外安详和放松的感觉。他们的意识好像飘离了身体,在一片虚无缥缈中升腾,然后会通过一个完全的暗夜,直到看见黎明的曙光,在黑与白之间他们会做一些选择与挣扎,只有最后留恋光明的人才会重新回到人间。有些人还会在临死时看见自己所有的亲朋好友,包括那些已经过世的。他们个个都像天使一样形象光辉高大;有人在这时候还能把自己生前的事迹再经历一遍,就像在看一场电影…… ————选自《世界未解之谜》
第五章 set命令详解
很久没发贴了,今天来写点讲BAT的新手教学贴!
在上一贴中我简单的介绍了一下SET设置自定义变量的作用,现在我来具体讲一下set的其他功能.
一、用set命令设置自定义变量
显示、设置或删除 cmd.exe 环境变量。 SET [variable=[string]] variable 指定环境变量名。 string 指定要指派给变量的一系列字符串。 要显示当前环境变量,键入不带参数的 SET。 SET 命令不允许变量名含有等号。
注意:以下用法将清除变量variable的值,使其变成未定义状态。 SET variable= 上面等号后面无任何符号,如果写成SET variable="",此时变量值并不为空,而是等于两个引号,即""
例子: @echo off set var=我是值 echo %var% pause
请看 set var=我是值 ,这就是BAT直接在批处理中设置变量的方法! set 是命令 var是变量名 =号右边的"我是值"是变量的值 在批处理中我们要引用这个变就把var变量名用两个%(百分号)扩起来,如%var%
SET还可以提供一个交互界面,让用户自己输入变量的值,然后我们在来根据这个值来做相应操作,现在我就来说说SET的这种语法,只需要加一个"/P"参数就可以了! SET /P variable=[promptString]
例子: @echo off set /p var=请输入变量的值: echo 您输入了 %var% ~_~ pause
set /p 是命令语法 var是变量名 =号右边的"请输入变量的值: ",这个是提示语,不是变量的值了! 运行后,我们在提示语后面直接输入1,就会显示一行您输入了 1 ~_~
好了,先回顾到这,现在讲SET其他功能
使用set /?查看SET的帮助我们发现SET除了我上面讲的 SET [variable=[string]] SET /P variable=[promptString] 这两种语法外,还有如下几种语法: SET /A expression 环境变量替换已如下增强: %PATH:str1=str2% %PATH:~10,5% %PATH:~-10% %PATH:~0,-2%
这机种语法有什么用处呢?下面我们来一个个讲解他们!
二、用set命令进行简单计算
语法:SET /A expression /A 命令行开关指定等号右边的字符串为被评估的数字表达式。该表达式 评估器很简单并以递减的优先权顺序支持下列操作: () -分组 ! ~ - -一元运算符 * / % -算数运算符 + - -算数运算符 << >> -二进制逻辑移位 & -二进制按位“与” ^ -二进制按位“异” | -二进制按位“或” = *= /= %= += -= -算数赋值 &= ^= |= <<= >>= -二进制运算赋值 , -表达式分隔符
如果 SET /A 在命令脚本外的命令行执行的,那么它显示该表达式的最后值。 除十六进制有 0x 前缀, 八进制有 0 前缀的,数字值为十进位数字。 因此, 0x12 与 18 和 022相同。请注意八进制公式可能很容易搞混: 08 和 09 是无效的数字,因为 8 和 9 不是有效的八进制位数。
上面这些是系统帮助里的内容,看着是不是有点晕,没关系我来简单解释一下: set的/A参数就是让SET可以支持数学符号进行加减等一些简单数学运算!
注意:一般的运算常为十进制运算,如果数字字符串最左边为0,将被认为是八进制,从而出错。比如,0812之类的数字不能参与十进制运算,转换方法为:10812-10000
例: set aa=0812 set /a aa=1%aa%-10000 echo %aa% 结果为:812
例: @echo off set /p input=请输入计算表达式: set /a var=%input% echo 计算结果:%input%=%var% pause
上面的例子是龙卷风设计的,很好用哟,请看下面几个运算过程: 注意:DOS计算只能进行整数运算,精确到整数
请输入计算表达式:1+9+20+30-10 计算结果:1+9+20+30-10=50 请按任意键继续. . .
请输入计算表达式:10/3 #除法只能精确到整数 计算结果:10/3=3 请按任意键继续. . .
请输入计算表达式:-100+62 #负数 计算结果:-100+62=-38 请按任意键继续. . .
请输入计算表达式:100%3 #求余数 计算结果:100%3=1 请按任意键继续. . . 注意:以上的求余数运算符%在批处理程序中必须写成%%
请输入计算表达式:(25+75)*2/(15+5) #括号 计算结果:(25+75)*2/(15+5)=10 请按任意键继续. . .
请输入计算表达式:1234567890*9876543210 #范围 无效数字。数字精确度限为 32 位。 计算结果:1234567890*9876543210= 请按任意键继续. . .
注意:上面的计算过程显示,DOS计算只能精确到32位,这个32位是指二进制32位,其中最高位为符号位(0为正,1为负),低位31位为数值。31个1换成十进制为2147483647,所以DOS计算的有效值范围是-2147483648至2147483647,超出该数值范围时计算出错,请看下面的计算过程:
请输入计算表达式:2147483647-1 #最大值减1,值有效 计算结果:2147483647-1=2147483646 请按任意键继续. . .
请输入计算表达式:2147483647+1 #最大值加1,出错,结果为最小值 计算结果:2147483647+1=-2147483648 请按任意键继续. . .
请输入计算表达式:-2147483648-1 #最小值减1,出错,结果为最大值 计算结果:-2147483648-1=2147483647 请按任意键继续. . .
运行set /a a=1+1,b=2+1,c=3+1后会显示一个4,但我们用 echo %a% %b% %c%后看结果,会发现其他数学运算也有效果!,这就是表达式分隔符"逗"号的 作用!
有时候我们需要直接在原变量进行加减操作就可以用这种语法 set /a var+=1 这样的语法对应原始语法就是set /a var = %var% + 1 都是一样的结果,在原变量的值上在进行数学运算,不过这样写简单一点 再来一个: set /a var*=2 其他都这么用,只要帮助里有这个语法!
另外还有一些用逻辑或取余操作符,这些符号,按照上面的使用方法会报错的
比如我们在CMD里输入set /a var=1 & 1 "与运算",他并不会显示为1,而是报错, 为什么?对于这样的"逻辑或取余操作符",我们需要把他们用双引号引起来,也可以用转义字符^,看例子
set /a var= 1 "&" 1 这样结果就显示出来了,其他逻辑或取余操作符用法 set /a var= 1 "+" 1 异运算 set /a var= 1 "%" 1 取模运算 set /a var= 3 "<<" 2 左移位运算, 3的二进制为11,左移2位为1100,换成十进制就是12,自行验证 set /a var= 4 ">>" 2右移位运算,4的二进制为100,右移动2位为1,结果为1
龙卷风补充:凡是按位计算均需换算成二进制。
思考题:求2的n次方 参考答案: @echo off set /p n=请输入2的几次方: set /a num=1^<^<n echo %num% pause
运行结果: 请输入2的几次方: 3 8 请按任意键继续. . .
请输入2的几次方: 10 1024 请按任意键继续. . .
请输入2的几次方: 15 32768 请按任意键继续. . .
休息一下!
---------------------------- 史前超文明谜团 ---------------------------- 奥克洛(Oklo)是非洲加蓬共和国一个铀矿的名字,法国有一些工厂使用从加蓬进口的铀矿石。1972年6月7日,法国科学家皮尔里特在用质谱计分析天然丰度的六氟化铀时,惊讶地发现,这批进口铀矿石已被人利用过了。因为这批铀矿石的含铀量相当低,铀矿石的一般含铀量为0.72%,而奥克洛铀矿石的含铀量却不足0.3%,和我们现有的核反应堆的废料几乎相同。 这件事引起了法国原子能委员会的高度重视。为此,许多科学家赶赴矿区进行考察研究。不久,奥克洛爆出了一条震惊世界的新闻:这里有一个古老的核反应堆,而且核反应堆的构成非常合理。法国政府宣布的这一发现,震惊了全世界。 这个核反应堆是由6个区域的大约500吨铀矿石组成,它的输出功率很低,只有10到100千瓦。据考证,该矿成矿年代大约在20亿年前,核反应堆在成矿后不久就开始运转,运转时间长达50万年之久,核反应所产生的废物,并没有扩散,而是局限在矿区周围。面对这个保存完整、结构合理的核反应堆,科学家们膛目结舌。 -------------- 耐人寻味的疑问 -------------- 是谁在20亿年前留下了这个古老的核反应堆?是外星人的作品,还是前一代地球文明的遗迹?20亿年前的反应堆又怎么来解释呢?这个铀矿到底是怎么回事呢?有人认为这是20亿年前的天外来客的杰作。他们乘坐宇宙飞船来到地球上,选择了奥克洛这个地方建造了原子反应堆,以原子裂变或聚变所释放的能量为能源动力,为他们在地球上的活动提供能量。后来,他们离开了地球,返回了他们的“故里”,就在地球上留下了这座极古老而又神秘的原子反应堆。还有一种推断认为这是史前文明所留下的遗迹。也就是说,20亿年前,在今天我们叫做奥克洛的地方,可能存在着高度发达的文明,远远超过今天的人类文明。 ————选自《世界未解之谜》
三、用set命令进行字符串处理
1、字符串替换
好了,符号说到这,现在说%PATH:str1=str2% 上面语法的意思就是:将字符串变量%PATH%中的str1替换为str2 这个是替换变量值的内容,看例子 @echo off set a= bbs. verybat. cn echo 替换前的值: "%a%" set var=%a: =% echo 替换后的值: "%var%" pause
运行显示:(龙卷风添加) 替换前的值: " bbs. verybat. cn" 替换后的值: "bbs.verybat.cn"
对比一下,我们发现他把变量%a%的空格给替换掉了,从这个例子,我们就可以发现 %PATH:str1=str2%这个操作就是把变量%PATH%的里的str1全部用str2替换
比如我们把上面的例子改成这样 @echo off set a=bbs.verybat.cn echo 替换前的值: "%a%" set var=%a:.=伤脑筋% echo 替换后的值: "%var%" pause
运行显示: 替换前的值: "bbs.verybat.cn" 替换后的值: "bbs伤脑筋verybat伤脑筋cn"
解释set var=%a:.=伤脑筋% set是命令 var是变量名 字a是要进行字符替换的变量的值,"."为要替换的值, "伤脑筋"为替换后的值! 执行后就会把变量%a%里面的"."全部替换为"伤脑筋" 这就是set的替换字符的很好的功能! 替换功能先讲到这,下面将字符串截取功能
请注意:字符串的替换和截取功能在引用变量的地方均可以,并不一定必须要有set命令 例: @echo off set a=bbs.verybat.cn echo 替换前的值: "%a%" echo 替换后的值: "%a:.=伤脑筋%" pause 此例在echo语句中就替换了字符串,效果一样。
2、字符串截取
********************************************** 截取功能统一语法格式为:%a:~[m[,n]]% ********************************************** 方括号表示可选,%为变量标识符,a为变量名,不可少,冒号用于分隔变量名和说明部分,符号~可以简单理解为“偏移”即可,m为偏移量(缺省为0),n为截取长度(缺省为全部)
%PATH:~10,5% 这个什么意思,看例子:
截取功能例子1: @echo off set a=bbs.verybat.cn set var=%a:~1,2% echo %var% pause
执行后,我们会发现只显示了"bs"两个字母,我们的变量%a%的值不是为bbs.verybat.cn吗? 怎么只显示了第2个字母和第3个字母"bs",分析一结果我们就可以很容易看出 %a:~10,5%就是显示变量a里从11位(偏移量10)开始的5个字符! 分析set var=%a:~1,2% set是命令,var是变量值,a要进行字符操作的变量,"1"从变量"a"第几位开始显示,"2"表示显示几位。 合起来就是把变量a的值从第2位(偏移量1)开始,把2个字符赋予给变量var 这样应该明白了吧~
其他两种语法 %PATH:~-10% %PATH:~0,-2% 他们也是显示指定变量指定几位的值的意思
%PATH:~-10% 看例子
截取功能例子2: @echo off set a=bbs.verybat.cn set var=%a:~-3% echo %var% pause 运行结果:.cn 这个就是把变量a倒数3位的值给变量VAR
当然我们也可以改成这样 截取功能例子3: @echo off set a=bbs.verybat.cn set var=%a:~3% echo %var% pause 运行显示:.verybat.cn 这个就是把变量a的从第3位开始后面全部的值给变量VAR
%PATH:~0,-2% 例子
截取功能例子4: @echo off set a=bbs.verybat.cn set var=%a:~0,-3% echo %var% pause 执行后,我们发现显示的是"bbs.verybat",少了".cn" 从结果分析,很容易分析出,这是把变量a的值从0位开始, 到倒数第三位之间的值全部赋予给var
如果改成这样
截取功能例子5: @echo off set a=bbs.verybat.cn set var=%a:~2,-3% echo %var% pause 运行显示:s.verybat 那么他就是显示从第3位(偏移量2)开始减去倒数三位字符的值,并赋予给变量var
讲得好,例子就是说明问题,为便于记忆,龙卷风小节如下: a=bbs.verybat.cn %a:~1,2% =“bs” 偏移量1,从第二位开始向右取2位 %a:~-3% =“.cn” 偏移量负3,即倒数3位(也可理解为留下右边3位),右取全部 %a:~3% =“.verybat.cn” 偏移量3(也可理解为去掉左边3位),右取全部 %a:~0,-3% =“bbs.verybat” 偏移量0,右取长度至负3,即倒数3位 %a:~2,-3% =“s.verybat” 偏移量2,右取长度至负3,即倒数3位
********************************************** 所以,截取功能统一语法格式为:%a:~[m[,n]]% ********************************************** 方括号表示可选,%a%为变量名,不可少,冒号用于分隔变量名和说明部分,符号~可以简单理解为“偏移”即可,m为偏移量(缺省为0),n为截取长度(缺省为全部) 上面所述用法其实相当于vbs函数mid、left、right %a:~0,n% 相当于函数left(a,n) 取左边n位 %a:~-m% 相当于函数right(a,m) 取右边m位 %a:~m,n% 相当于函数mid(a,m+1,n) 从m+1位开始取n位 %a:~m,-n% 相当于函数mid(a,m+1,len(a)-m-n),从m+1位开始,至倒数n+1位 %a:~m % 相当于函数mid(a,m+1,len(a)-m) 或者right(a,len(a)-m),从m+1位开始取右边全部。
思考题目:输入任意字符串,求字符串的长度 参考答案:
@echo off set /p str=请输入任意长度的字符串: echo 你输入了字符串:"%str%" call :stringlenth "%str%" num echo 字符串长度为:%num% pause exit
:StringLenth ::---------字符串长度计算子程序 ::---------参数%1为字符串(如有空格,请用引号括起来) ::---------参数%2为返回变量名称,不能含空格或特殊字符 ::@echo off set theString=%~1 if not defined theString goto :eof set Return=0 :StringLenth_continue set /a Return+=1 set thestring=%thestring:~0,-1% if defined thestring goto StringLenth_continue if not "%2"=="" set %2=%Return% goto :eof
好了set的一些用法,就介绍到这了,希望对各位有所帮助,时间不早睡觉Zz....
by 伤脑筋
休息休息!
诗曰:
混沌未分天地乱,茫茫渺渺无人见。 自从盘古破鸿蒙,开辟从兹清浊辨。 覆载群生仰至仁,发明万物皆成善。 欲知造化会元功,须看西游释厄传。
《西游记》是我国著名神话小说,是中华五千年文化的见证之一。唐僧乃大唐高僧玄奘法师,往印度求取佛经,致使中华佛家文化大放异彩。 唐僧:代表古代修行人对佛法的坚定执着之心。虽然唐僧手无缚鸡之力,但他不受金钱、美女、权利的诱惑,面对生死也不改变志向。这些都是古人所推崇的,所以唐僧是师父,其他人再有本事也只能当徒弟了。 悟空:“空”、“无”都是高层次的体现,故悟空本事最大。悟空的兵器为“定海神针”,寓意佛家的“定”。 悟能:层次不高,缺点也多,但有点本事。因其缺点多,故又名“八戒”。 悟净:层次不高,本事不大,仅仅有一个清净之心,故名“悟净”。但清净心也很重要,所以有几次悟空遇难时,乃悟净所救。
第六章 if命令讲解
最近发现有些朋友一老问IF命令的用法,IF命令个人觉得很简单,所以就一直没把发放到新手教学贴里说,现在我给补上一文,希望对各位"非常BAT的"新手朋友们有所帮助.
现在开始:
在CMD使用IF /?打开IF的系统帮助(自己看我就不全部列出来了),我们会发现IF有3种基本的用法! 执行批处理程序中的条件处理。
IF [NOT] ERRORLEVEL number command IF [NOT] string1==string2 command IF [NOT] EXIST filename command
NOT 指定只有条件为 false 的情况下, Windows XP 才 应该执行该命令。
ERRORLEVEL number 如果最后运行的程序返回一个等于或大于 指定数字的退出编码,指定条件为 true。
string1==string2 如果指定的文字字符串匹配,指定条件为 true。
EXIST filename 如果指定的文件名存在,指定条件为 true。
command 如果符合条件,指定要执行的命令。如果指定的 条件为 FALSE,命令后可跟一个执行 ELSE 关键字后的命令的 ELSE 命令。
ELSE 子句必须在 IF 之后出现在同一行上。例如:
IF EXIST filename ( del filename ) ELSE ( echo filename missing )
第一种用法:IF [NOT] ERRORLEVEL number command
这个用法的基本做用是判断上一条命令执行结果的代码,以决定下一个步骤. 一般上一条命令的执行结果代码只有两结果,"成功"用0表示 "失败"用1表示.
举个例子: @echo off net user IF %ERRORLEVEL% == 0 echo net user 执行成功了! pause
这是个简单判断上条命令是否执行成功. 细心的朋友可能会发现,这个用法和帮助里的用法不太一样,按照帮助里的写法"IF %ERRORLEVEL% == 0 echo net user 执行成功了! "这一句代码应该写成:IF ERRORLEVEL 0 echo net user 执行成功了! 那为什么我要写成这样呢?各位自己把代码改掉执行后,就会发现错误了!用这种语法,不管你的上面的命令是否执行成功,他都会认为命令成功了,不知道是BUG还是本人理解错误...
补充:这不是bug,而是 if errorlevel 语句的特点:当使用 if errorlevel 0 …… 的句式时,它的含义是:如果错误码的值大于或等于0的时候,将执行某个操作;当使用 if %errorlevel%==0 …… 的句式时,它的含义是:如果错误码的值等于0的时候,将执行某操作。因为这两种句式含义的差别,如果使用前一种句式的时候,错误码语句的排列顺序是从大到小排列
%ERRORLEVEL% 这是个系统变量,返回上条命令的执行结果代码! "成功"用0表示 "失败"用1表示. 当然还有其他参数,用的时候基本就这两数字. 一般上一条命令的执行结果代码只有两结果,"成功"用0表示 "失败"用1表示 这只是一般的情况,实际上,errorlevel返回值可以在0~255之间,比如,xcopy默认的errorlevel值就有5个,分别表示5种执行状态:
退出码 说明 0 文件复制没有错误。 1 if errorlevel 2 echo。 2 用户按 CTRL+C 终止了 xcopy。 4 出现了初始化错误。没有足够的内存或磁盘空间,或命令行上输入了无效的驱动器名称或语法。 5 出现了磁盘写入错误。
要判断上面xcopy命令的5种退出情况,应写成: if errorlevel 5 echo出现了磁盘写入错误 if errorlevel 4 echo出现了初始化错误 if errorlevel 2 echo用户按 CTRL+C 终止了 xcopy if errorlevel 1 echo if errorlevel 2 echo if errorlevel 0 echo文件复制没有错误。 才能正确执行。
补充完毕。
再举几个例子给新手理解 @echo off net usertest IF %ERRORLEVEL% == 1 echo net user 执行失败了! pause
这个是判断上一条命令是否执行失败的
@echo off set /p var=随便输入个命令: %var% if %ERRORLEVEL% == 0 goto yes goto no :yes echo !var! 执行成功了 pause exit :no echo 基本上执行失败了.. pause
这个是根据你输入的命令,自动判断是成功还是失败了!
在来一个简化版的 @echo off set /p var=随便输入个命令: %var% if %ERRORLEVEL% == 0 (echo %var%执行成功了) ELSE echo %var%执行失败了! pause
else后面写上执行失败后的操作!
当然我门还可以把if else这样的语句分成几行写出来,使他看上去好看点... @echo off set /p var=随便输入个命令: %var% if %ERRORLEVEL% == 0 ( echo !var! 执行成功了 ) ELSE ( echo 基本上执行失败了.. ) pause
这里介绍的两种简写对IF的三种语法都可以套用,不单单是在IF [NOT] ERRORLEVEL number command 这种法上才能用
第二种用法:IF [NOT] string1==string2 command
这个呢就是用来比较变量或者字符的值是不是相等的.
例子 @echo off set /p var=请输入第一个比较字符: set /p var2=请输入第二个比较字符: if %var% == %var2% (echo 我们相等) ELSE echo 我们不相等 pause
上面这个例子可以判断你输入的值是不是相等,但是你如果输入相同的字符,但是如果其中一个后面打了一个空格, 这个例子还是会认为相等,如何让有空格的输入不相等呢?我们在比较字符上加个双引号就可以了. @echo off set /p var=请输入第一个比较字符: set /p var2=请输入第二个比较字符(多输入个空格试试): if "%var%" == "%var2%" (echo 我们相等) ELSE echo 我们不相等 pause
第三种用法:IF [NOT] EXIST filename command
这个就是判断某个文件或者文件夹是否存在的语法
例子 @echo off if exist "c:\test" (echo 存在文件) ELSE echo 不存在文件 pause
判断的文件路径加引号是为了防止路径有空格,如果路径有空格加个双引号就不会出现判断出错了!
这个语法没什么太多的用法,基本就这样了,就不多介绍了.
另外我们看到每条IF用法后都有个[NOT]语句,这啥意思?其他加上他的话,就表示先判断我们的条件不成立时, 没加他默认是先判断条件成立时,比如上面这个例子 @echo off if not exist "c:\test" (echo 存在文件) ELSE echo 不存在文件 pause
加个NOT,执行后有什么结果,如果你的C盘下根本就没c:\test,他还是会显示"存在文件",这就表示了加了NOT就 会先判断条件失败!懂了吧,上面例子改成这样就正确了! @echo off if not exist "c:\test" (echo 不存在文件) ELSE echo 存在文件 pause
第四种用法:IF增强的用法
IF [/I] string1 compare-op string2 command #参数/I表示不区分大小写 IF CMDEXTVERSION number command IF DEFINED variable command #判断变量是否存在,很有用
CMDEXTVERSION 条件的作用跟 ERRORLEVEL 的一样,除了它 是在跟与命令扩展名有关联的内部版本号比较。第一个版本 是 1。每次对命令扩展名有相当大的增强时,版本号会增加一个。 命令扩展名被停用时,CMDEXTVERSION 条件不是真的。
如果已定义环境变量,DEFINED 条件的作用跟 EXISTS 的一样 IF DEFINED variable command IF NOT "variable"=="" command 上面两条命令效果一样。
用“set variable=”命令使变量variable变成未定义,即空值。
一句话,变量值为空,则为未定义;变量值不为空,则为已定义。 用语句IF DEFINED variable command判断变量是否存在时,请注意variable为不使用引导符号%的变量名,不能用写为%variable%,否则出错。
例: if defined aa (echo 变量aa存在) else (echo 变量aa不存在) 运行显示:变量aa不存在
例: set aa=123 set aa= if defined aa (echo 变量aa存在) else (echo 变量aa不存在) 运行显示:变量aa不存在
例: @echo off if a == A (echo 我们相等) ELSE echo 我们不相等 pause
执行后会显示:我们不相等
例: @echo off if /i a == A (echo 我们相等) ELSE echo 我们不相等 pause
加上/I不区分大小写就相等了!
最后面还有一些用来判断数字的符号
EQU - 等于 NEQ - 不等于 LSS - 小于 LEQ - 小于或等于 GTR - 大于 GEQ - 大于或等于
我就举一个例子,大家都懂数学...不讲多了 @echo off set /p var=请输入一个数字: if %var% LEQ 4 (echo 我小于等于4) ELSE echo 我不小于等于4 pause
BY 伤脑筋
---------------------------- 难明其妙的水宫殿 ---------------------------- 土耳其首都伊斯坦布尔是座横跨欧亚的历史名城。来自欧亚非三大洲的各种文化在此交织碰撞,形成了各种文明奇迹,也留下了许多难解的谜题。在伊斯坦布尔郊外的埃列巴坦有座被当地人视为“恶魔之地”的宫殿,传说殿中藏有恶魔。人们从空旷阴森的大殿外走过,往往能听到里面奇怪的哗哗水声,格外玄秘恐怖,没有人敢去探个究竟。直到1920年,一对情侣才在好奇心的驱使下走进了大殿。他们刚刚踏入殿中,突然一声巨响,地下顿时大水汹涌。两人急忙转身逃出,发现大水已经高出门槛但却并不溢出。转眼之间,水又立即退下,无影无踪。两人鼓足勇气再次走进大殿,才发现这里竟是一座华丽无比的古罗马式厅堂,有高耸雪白的大理石柱、呼之欲出的美丽雕像、繁复优美的高雅壁画。 闻讯而来的考古学家们对宫殿进行了全面的勘查,发现它大约建于公元4世纪左右,有可能是东罗马帝国的君士坦丁大帝定都于此后的建筑。殿中的大水涨落极有规律,一昼夜涨落6次,每次都有准确的时间。更奇怪的是宫殿大门之下发现的一堆碎石,它似乎是控制着水涨水落的闸门。碎石底下是一排空心圆柱,似乎是引水管道。这座奇怪的建筑是干什么用的呢?有人说是罗马人的蓄水池。那么它为什么要建得如此华丽,而且能够控制水位涨落呢?为什么大水高过门槛却漫不出来呢?它的工作原理又是什么? ————选自《世界未解之谜》
第七章 DOS编程高级技巧
本章节乃龙卷风根据自己平时学用批处理的经验而总结的,不断补充中……。
一、交互界面设计
没啥说的,看看高手设计的菜单界面吧: @echo off cls title 终极多功能修复 :menu cls color 0A echo. echo ============================== echo 请选择要进行的操作,然后按回车 echo ============================== echo. echo 1.网络修复及上网相关设置,修复IE,自定义屏蔽网站 echo. echo 2.病毒专杀工具,端口关闭工具,关闭自动播放 echo. echo 3.清除所有多余的自启动项目,修复系统错误 echo. echo 4.清理系统垃圾,提高启动速度 echo. echo Q.退出 echo. echo. :cho set choice= set /p choice= 请选择: IF NOT "%choice%"=="" SET choice=%choice:~0,1% if /i "%choice%"=="1" goto ip if /i "%choice%"=="2" goto setsave if /i "%choice%"=="3" goto kaiji if /i "%choice%"=="4" goto clean if /i "%choice%"=="Q" goto endd echo 选择无效,请重新输入 echo. goto cho 只要学完本教程前面的章节,上面的程序应该能看懂了。
二、if…else…条件语句
前面已经谈到,DOS条件语句主要有以下形式 IF [NOT] ERRORLEVEL number command IF [NOT] string1==string2 command IF [NOT] EXIST filename command 增强用法:IF [/I] string1 compare-op string2 command 增强用法中加上/I就不区分大小写了! 增强用法中还有一些用来判断数字的符号:
EQU - 等于 NEQ - 不等于 LSS - 小于 LEQ - 小于或等于 GTR - 大于 GEQ - 大于或等于
上面的command命令都可以用小括号来使用多条命令的组合,包括else子句,组合命令中可以嵌套使用条件或循环命令。
例如:
IF EXIST filename ( del filename ) ELSE ( echo filename missing )
也可写成: if exist filename (del filename) else (echo filename missing) 但这种写法不适合命令太多或嵌套命令的使用。
---------------------------- 水晶人头之谜 ---------------------------- 你可曾见到这样一颗水晶雕成的人头?它和真人头骨同等大小,用一整块水晶雕琢而成,牙齿十分整齐地排列在牙床上,鼻骨由3颗水晶石拼接起来,两只眼睛各为一块圆形水晶。人头的底部还藏着棱镜。它的模样估计是一个女人的头颅。整个水晶头骨上没有任何人工打磨的痕迹,看上去精美绝伦、熠熠生辉,即使用现代科技雕琢它也会十分耗时费工,可科学家却推断它早在3600年前就已诞生,你相信有这样的事情吗? 这颗水晶头骨发现于中美洲的洪都拉斯,难道是印第安人的祖先制作出来的吗?可20世纪的印第安人还在美洲的丛林里过着衣不蔽体、食不果腹的原始生活,谁能相信他们的祖先早在几千年前就拥有了如此高超的雕刻技艺呢?我们知道,水晶的硬度非常之高,用一般的器具是很难对其加工的,那么古人是用什么工具雕刻它的呢?而且要找到这么大的水晶实在是不容易的事情啊。他们又如何能凭借原始的手工工具把它雕刻得如此成功?现在研究者还一致认为,当时的加工者并不了解水晶晶体的结构,他们也不具备现代的光学和人体骨骼构造的知识,在这样一种模糊的认识上能雕刻出这样的杰作,实在让人称奇!在古代玛雅的传说里,这颗水晶人头具有某种神奇的力量,他们通过它与神灵相通。 ————选自《世界未解之谜》
三、循环语句
1、指定次数循环 FOR /L %variable IN (start,step,end) DO command [command-parameters]
组合命令: FOR /L %variable IN (start,step,end) DO ( Command1 Command2 …… )
2、对某集合执行循环语句。 FOR %%variable IN (set) DO command [command-parameters]
%%variable 指定一个单一字母可替换的参数。 (set) 指定一个或一组文件。可以使用通配符。 command 对每个文件执行的命令,可用小括号使用多条命令组合。
FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]
检查以 [drive:]path 为根的目录树,指向每个目录中的 FOR 语句。如果在 /R 后没有指定目录,则使用当前 目录。如果集仅为一个单点(.)字符,则枚举该目录树。
同前面一样,command可以用括号来组合: FOR /R [[drive:]path] %variable IN (set) DO ( Command1 Command2 …… commandn )
3、条件循环 上面的循环结构是用for命令来实现的,for命令循环有一个缺点,就是整个循环被当作一条命令语句,涉及到变量延迟的问题。 利用goto语句和条件判断,dos可以实现条件循环,很简单啦,看例子:
例: @echo off set var=0 rem ************循环开始了 :continue set /a var+=1 echo 第%var%次循环 if %var% lss 100 goto continue rem ************循环结束了 echo 循环执行完毕 pause
例: @echo off set var=100 rem ************循环开始了 :continue echo 第%var%次循环 set /a var-=1 if %var% gtr 0 goto continue rem ************循环结束了 echo 循环执行完毕 pause
四、子程序
在批处理程序中可以调用外部可运行程序,比如exe程序,也可调用其他批处理程序,这些也可以看作子程序,但是不够方便,如果被调用的程序很多,就显得不够简明了,很繁琐。 在windowsXP中,批处理可以调用本程序中的一个程序段,相当于子程序,这些子程序一般放在主程序后面。
子程序调用格式: CALL :label arguments
子程序语法: :label command1 command2 ...... commandn goto :eof
在子程序段中,参数%0指标签:label
子过程一般放在最后,并且注意在主程序最后要加上exit或跳转语句,避免错误的进入子过程。
子程序和主程序中的变量都是全局变量,其作用范围都是整个批处理程序。
传至子程序的参数在call语句中指定,在子程序中用%1、%2至%9的形式调用,而子程序返回主程序的数据只需在调用结束后直接引用就可以了,当然也可以指定返回变量,请看下面的例子。
子程序例1: @echo off call :sub return 你好 echo 子程序返回值:%return% pause
:sub set %1=%2 goto :eof 运行结果:你好
子程序例2:设计一个求多个整数相加的子程序 @echo off set sum=0 call :sub sum 10 20 35 echo 数据求和结果:%sum% pause
:sub rem 参数1为返回变量名称 set /a %1=%1+%2 shift /2 if not "%2"=="" goto sub goto :eof
运行结果:65
在win98系统中,不支持上面这种标号调用,须将子程序单独保存为一个批处理程序,然后调用。
---------------------------- 进化论的空白之谜 ---------------------------- 古猿:生活于1400万~800万年前 南猿:生活于400万~190万年前 猿人:生活于170万~20万年前 在这三个阶段的两大衔接处,有几百万年的空白,科学家迄今没有发现此间的任何生物化石。 ————选自《世界未解之谜》
五、用ftp命令实现自动下载
ftp是常用的下载工具,ftp界面中有40多个常用命令,自己学习了,不介绍了。这里介绍如何用dos命令行调用ftp命令,实现ftp自动登录,并上传下载,并自动退出ftp程序。 其实可以将ftp命令组合保存为一个文本文件,然后用以下命令调用即可。
ftp -n -s:[[drive:]path]filename
上面的filename为ftp命令文件,包括登录IP地址,用户名、密码、操作命令等 例: open 90.52.8.3 #打开ip user iware #用户为iware password8848 #密码 bin #二进制传输模式 prompt cd tmp1 #切换至iware用户下的tmp1目录 pwd lcd d:\download #本地目录 mget * #下载tmp1目录下的所有文件 bye #退出ftp
六、用7-ZIP实现命令行压缩和解压功能
语法格式:(详细情况见7-zip帮助文件,看得头晕可以跳过,用到再学) 7z <command> [<switch>...] <base_archive_name> [<arguments>...]
7z.exe的每个命令都有不同的参数<switch>,请看帮助文件 <base_archive_name>为压缩包名称 <arguments>为文件名称,支持通配符或文件列表
其中,7z是至命令行压缩解压程序7z.exe,<command>是7z.exe包含的命令,列举如下:
a: Adds files to archive. 添加至压缩包 a命令可用参数: -i (Include) -m (Method) -p (Set Password) -r (Recurse) -sfx (create SFX) -si (use StdIn) -so (use StdOut) -ssw (Compress shared files) -t (Type of archive) -u (Update) -v (Volumes) -w (Working Dir) -x (Exclude)
b: Benchmark
d: Deletes files from archive. 从压缩包中删除文件 d命令可用参数: -i (Include) -m (Method) -p (Set Password) -r (Recurse) -u (Update) -w (Working Dir) -x (Exclude)
e: Extract解压文件至当前目录或指定目录 e命令可用参数: -ai (Include archives) -an (Disable parsing of archive_name) -ao (Overwrite mode) -ax (Exclude archives) -i (Include) -o (Set Output Directory) -p (Set Password) -r (Recurse) -so (use StdOut) -x (Exclude) -y (Assume Yes on all queries)
l: Lists contents of archive. t: Test u: Update
x: eXtract with full paths用文件的完整路径解压至当前目录或指定目录 x命令可用参数: -ai (Include archives) -an (Disable parsing of archive_name) -ao (Overwrite mode) -ax (Exclude archives) -i (Include) -o (Set Output Directory) -p (Set Password) -r (Recurse) -so (use StdOut) -x (Exclude) -y (Assume Yes on all queries)
七、调用VBScript程序
使用 Windows 脚本宿主,可以在命令提示符下运行脚本。CScript.exe 提供了用于设置脚本属性的命令行开关。
用法:CScript 脚本名称 [脚本选项...] [脚本参数...]
选项: //B 批模式:不显示脚本错误及提示信息 //D 启用 Active Debugging //E:engine 使用执行脚本的引擎 //H:CScript 将默认的脚本宿主改为 CScript.exe //H:WScript 将默认的脚本宿主改为 WScript.exe (默认) //I 交互模式(默认,与 //B 相对) //Job:xxxx 执行一个 WSF 工作 //Logo 显示徽标(默认) //Nologo 不显示徽标:执行时不显示标志 //S 为该用户保存当前命令行选项 //T:nn 超时设定秒:允许脚本运行的最长时间 //X 在调试器中执行脚本 //U 用 Unicode 表示来自控制台的重定向 I/O
“脚本名称”是带有扩展名和必需的路径信息的脚本文件名称,如d:\admin\vbscripts\chart.vbs。 “脚本选项和参数”将传递给脚本。脚本参数前面有一个斜杠 (/)。每个参数都是可选的;但不能在未指定脚本名称的情况下指定脚本选项。如果未指定参数,则 CScript 将显示 CScript 语法和有效的宿主参数。
八、将批处理转化为可执行文件:
由于批处理文件是一种文本文件,任何人都可以对其进行随便编辑,不小心就会把里面的命令破坏掉,所以如果将其转换成.com格式的可执行文件,不仅执行效率会大大提高,而且不会破坏原来的功能,更能将优先级提到最高。Bat2Com就可以完成这个转换工作。 小知识:在DOS环境下,可执行文件的优先级由高到低依次为.com>.exe>.bat>.cmd,即如果在同一目录下存在文件名相同的这四类文件,当只键入文件名时,DOS执行的是name.com,如果需要执行其他三个文件,则必须指定文件的全名,如name.bat。
这是一个只有5.43K大小的免费绿色工具,可以运行在纯DOS或DOS窗口的命令行中,用法:Bat2Com FileName,这样就会在同一目录下生成一个名为FileNme.com的可执行文件,执行的效果和原来的.bat文件一样。
---------------------------- 人体辉光之谜 ---------------------------- 现代科技发现了很多让人吃惊的现象,它能使人们相信很多在传说或者梦境里才有的事情。宗教油画上的小天使总是头顶光圈飞来飞去。可你相信吗?在我们每个人的身体表面其实都有一层肉眼所见不到的彩色光!天使拥有的还只是头顶的光圈,可我们拥有的是全身的辉光,这多神奇。只要通过特殊的手段,譬如凭借某种涂了特殊颜料的玻璃,我们就能亲眼见到自己身体周围的辉光。而科学家发明了一种特殊的高频电场照相技术,能把人体辉光的状况显示在彩色照片上,不仅能让我们一睹为快,还能永久收藏。这实在是一件有意思的事情。科学家的实验还发现人体辉光是处于变动之中的,人体不同部位辉光的颜色不一样,而且在人体的精神和身体状况有变动时,辉光的明暗、强弱和大小都会随之发生变化。 ————选自《世界未解之谜》
九、时间延迟
本条参考引用[英雄]教程 什么是时间延迟?顾名思义,就是执行一条命令后延迟一段时间再进行下一条命令。 延迟的应用见下节:“模拟进度条”。 1、利用ping命令延时 例: @echo off echo 延时前:%time% ping /n 3 127.0.0.1 >nul echo 延时后:%time% pause 解说:用到了ping命令的“/n”参数,表示要发送多少次请求到指定的ip。本例中要发送3次请求到本机的ip(127.0.0.1)。127.0.0.1可简写为127.1。“>nul”就是屏蔽掉ping命令所显示的内容。
2、利用for命令延时 例: @echo off echo 延时前:%time% for /l %%i in (1,1,5000) do echo %%i>nul echo 延时后:%time% pause 解说:原理很简单,就是利用一个计次循环并屏蔽它所显示的内容来达到延时的目的。
3、利用vbs延迟函数,精确度毫秒,误差1000毫秒内
例: @echo off echo %time% call :delay 5000 echo %time% pause exit
:delay echo WScript.Sleep %1>delay.vbs CScript //B delay.vbs del delay.vbs goto :eof
运行显示: 10:44:06.45 10:44:11.95 请按任意键继续. . .
上面的运行结果显示实际延时了5500毫秒,多出来的500毫秒时建立和删除临时文件所耗费的时间。误差在一秒之内。
4、仅用批处理命令实现任意时间延迟,精确度10毫秒,误差50毫秒内
仅用批处理命令就可以实现延迟操作。
例:
@echo off set /p delay=请输入需延迟的毫秒数: set TotalTime=0 set NowTime=%time% ::读取起始时间,时间格式为:13:01:05.95 echo 程序开始时间:%NowTime% :delay_continue set /a minute1=1%NowTime:~3,2%-100 ::读取起始时间的分钟数 set /a second1=1%NowTime:~-5,2%%NowTime:~-2%0-100000 ::将起始时间的秒数转为毫秒 set NowTime=%time% set /a minute2=1%NowTime:~3,2%-100 :: 读取现在时间的分钟数 set /a second2=1%NowTime:~-5,2%%NowTime:~-2%0-100000 ::将现在时间的秒数转为毫秒 set /a TotalTime+=(%minute2%-%minute1%+60)%%60*60000+%second2%-%second1% if %TotalTime% lss %delay% goto delay_continue echo 程序结束时间:%time% echo 设定延迟时间:%delay%毫秒 echo 实际延迟时间:%TotalTime%毫秒 pause
运行显示:
请输入需延迟的毫秒数:6000 程序开始时间:15:32:16.37 程序结束时间:15:32:22.37 设定延迟时间:6000毫秒 实际延迟时间:6000毫秒 请按任意键继续. . .
实现原理:首先设定要延迟的毫秒数,然后用循环累加时间,直到累加时间大于等于延迟时间。
误差:windows系统时间只能精确到10毫秒,所以理论上有可能存在10毫秒误差。 经测试,当延迟时间大于500毫秒时,上面的延迟程序一般不存在误差。当延迟时间小于500毫秒时,可能有几十毫秒误差,为什么?因为延迟程序本身也是有运行时间的,同时系统时间只能精确到10毫秒。
为了方便引用,可将上面的例子改为子程序调用形式:
@echo off echo 程序开始时间:%Time% call :delay 10 echo 实际延迟时间:%totaltime%毫秒 echo 程序结束时间:%time% pause exit
::-----------以下为延时子程序-------------------- :delay @echo off if "%1"=="" goto :eof set DelayTime=%1 set TotalTime=0 set NowTime=%time% ::读取起始时间,时间格式为:13:01:05.95 :delay_continue set /a minute1=1%NowTime:~3,2%-100 set /a second1=1%NowTime:~-5,2%%NowTime:~-2%0-100000 set NowTime=%time% set /a minute2=1%NowTime:~3,2%-100 set /a second2=1%NowTime:~-5,2%%NowTime:~-2%0-100000 set /a TotalTime+=(%minute2%-%minute1%+60)%%60*60000+%second2%-%second1% if %TotalTime% lss %DelayTime% goto delay_continue goto :eof
十、模拟进度条
下面给出一个模拟进度条的程序。如果将它运用在你自己的程序中,可以使你的程序更漂亮。
@echo off mode con cols=113 lines=15 &color 9f cls echo. echo 程序正在初始化. . . echo. echo ┌──────────────────────────────────────┐ set/p= ■<nul for /L %%i in (1 1 38) do set /p a=■<nul&ping /n 1 127.0.0.1>nul echo 100%% echo └──────────────────────────────────────┘ pause
解说:“set /p a=■<nul”的意思是:只显示提示信息“■”且不换行,也不需手工输入任何信息,这样可以使每个“■”在同一行逐个输出。“ping /n 0 127.1>nul”是输出每个“■”的时间间隔,即每隔多少时间输出一个“■”。
十一、特殊字符的输入及应用
开始 -> 运行 -> 输入cmd -> edit -> ctrl+p(意思是允许输入特殊字符)-> 按ctrl+a将会显示笑脸图案。
(如果要继续输入特殊字符请再次按ctrl+p,然后ctrl+某个字母)
以上是特殊字符的输入方法,选自[英雄]教程,很管用的。也就是用编辑程序edit输入特殊字符,然后保存为一文本文件,再在windows下打开此文件,复制其中的特殊符号即可。
一些简单的特殊符号可以在dos命令窗口直接输入,并用重定向保存为文本文件。 例: C:>ECHO ^G>temp.txt “^G”是用Ctrl+G或Alt+007输入,输入多个^G可以产生多声鸣响。
特殊字符的应用也很有意思,这里仅举一例:退格键
退格键表示删除左边的字符,此键不能在文档中正常输入,但可以通过edit编辑程序录入并复制出来。即“”。
利用退格键,可以设计闪烁文字效果
例:文字闪烁 @echo off :start set/p=床前明月光<nul ::显示文字,光标停于行尾 ping -n 0 127.0.0.1>nul ::设置延迟时间 set /p a=<nul :: 输出一些退格符将光标置于该行的最左端(退格符的数量可以自己调整)。 set /p a= <nul ::输出空格将之前输出的文字覆盖掉。 set /p a=<nul ::再次输出退格符将光标置于该行的最左端,这里的退格符数量一定不能比前面的空格数少。 ::否则光标不能退到最左端。 goto start
例:输出唐诗一首,每行闪动多次 @echo off setlocal enabledelayedexpansion
set str=床前明月光 疑是地上霜 举头望明月 低头思故乡 ::定义字符串str for %%i in (%str%) do ( rem 由于str中含有空格,则以空格为分隔符将str中的每一个部分依次赋给变量%%i。 set char=%%i echo. echo. for /l %%j in (0,1,5) do ( set/p=!char:~%%j,1!<nul rem 依次取出变量char中的每一个字符,并显示。 ping -n 0 127.0.0.1>nul rem 设置输出每个字符的时间延迟。 ) call :hero %%i ) pause>nul exit
:hero for /l %%k in (1,1,10) do ( ping /n 0 127.0.0.1>nul set /p a=<nul set /p a= <nul set /p a=<nul ping /n 0 127.0.0.1>nul set /p a=%1<nul ) ::文字闪动 goto :eof
---------------------------- 神秘的瑜伽 ---------------------------- 印度的瑜伽术充满了神奇,很多人曾亲眼见识过瑜伽师的奇特本领。他们能够表演“千里问诊”、“外气治病”、“静会腾身”、“思维传递”等令人拍案称奇的功夫;更玄的是,有的瑜伽师还能控制自己心脏的跳动,这不能不令观者瞠目结舌。一位叫马哈里的瑜伽师就当众做过这种表演。在他运气静坐的时候,没有脉搏和心音。医生的心电图显示为一条直线!这真是让人难以相信。而另一位叫萨蒂雅鲁尔蒂的瑜伽师更是在众目睽睽之下被活埋了8昼夜。他在这期间没有进食,没有脉搏,没有呼吸,心电图也出现了直线,直到最后一天心电图才恢复成曲线。他出土的时候,全身僵硬,反应麻木,过了一段时间后才渐渐恢复正常。 科学家力图用科学知识对此做出合理解释。他们发现在瑜伽师静坐练功的时候,其人体代谢会降低,耗氧量会减少,肌体也能得到充分休息。而在表演心脏停止时,他们或者急剧提高腹压,减少心脏供血,而使其体积变小、活动减弱;或者是通过猛烈收缩胃部,使相应神经急剧紧张,而大大降低心脏活动。可这些都只能使瑜伽师能在一定程度上控制心脏活动,而他们居然能使心脏完全停止跳动,这是现代科学所无法解答的。 ————选自《世界未解之谜》
十二、随机数(%random%)的应用技巧
%RANDOM% 系统变量 返回 0 到 32767 之间的任意十进制数字。由 Cmd.exe 生成。
2的15次方等于32768,上面的0~32767实际就是15位二进制数的范围。
那么,如何获取100以内的随机数呢?很简单,将%RANDOM%按100进行求余运算即可,见例子。
例:生成5个100以内的随机数 @echo off setlocal enabledelayedexpansion for /L %%i in (1 1 5) do ( set /a randomNum=!random!%%100 echo 随机数:!randomNum! ) pause 运行结果:(每次运行不一样) 随机数:91 随机数:67 随机数:58 随机数:26 随机数:20 请按任意键继续. . .
求余数运算set /a randomNum=!random!%%100中的100可以是1~32768之间的任意整数。
总结:利用系统变量%random%,求余数运算%%,字符串处理等,可以实现很多随机处理。
思考题目:生成给定位数的随机密码 解答思路:将26个英文字母或10数字以及其它特殊字符组成一个字符串,随机抽取其中的若干字符。
参考答案1:(简单) @echo off call :randomPassword 5 pass1 pass2 echo %pass1% %pass2% pause exit
:randomPassword ::---------生成随机密码 ::---------%1为密码长度,%2及以后为返回变量名称 ::---------for命令最多只能区分31个字段 @echo off set password_len=%1 if not defined password_len goto :eof if %password_len% lss 1 goto :eof set wordset=a b c d e f g h i j k l m n o p q r s t u v w x y z set return= set num=0 :randomPassword1 set /a num+=1 set /a numof=%random%%%26+1 for /f "tokens=%numof% delims= " %%i in ("%wordset%") do set return=%return%%%i if %num% lss %password_len% goto randomPassword1 if not "%2"=="" set %2=%return% shift /2 if not "%2"=="" goto randomPassword goto :eof
参考答案2:(最优) @echo off call :randomPassword 6 pass1 pass2 pass3 echo %pass1% %pass2% %pass3% pause exit
:randomPassword ::---------生成随机密码 ::---------%1为密码长度,%2及以后为返回变量名称 ::---------goto循环、变量嵌套、命令嵌套 @echo off if "%1"=="" goto :eof if %1 lss 1 goto :eof set password_len=%1 set return= set wordset=abcdefghijklmnopqrstuvwxyz023456789_ ::---------------------------循环 :randomPassword1 set /a numof=%random%%%36 call set return=%return%%%wordset:~%numof%,1%% set /a password_len-=1 if %password_len% gtr 0 goto randomPassword1 ::---------------------------循环 if not "%2"=="" set %2=%return% shift /2 if not "%2"=="" goto randomPassword goto :eof
说明:本例涉及到变量嵌套和命令嵌套的应用,见后。
十三、变量嵌套 与 命令嵌套
和其它编程语言相比,dos功能显得相对简单,要实现比较复杂的功能,需要充分运用各种技巧,变量嵌套与命令嵌套就是此类技巧之一。
先复习一下前面的“字符串截取”的关键内容:
********************************************** 截取功能统一语法格式为:%a:~[m[,n]]% ********************************************** 方括号表示可选,%为变量标识符,a为变量名,不可少,冒号用于分隔变量名和说明部分,符号~可以简单理解为“偏移”即可,m为偏移量(缺省为0),n为截取长度(缺省为全部)。
百分号如果需要当成单一字符,必须写成%%
以上是dos变量处理的通用格式,如果其中的m、n为变量,那么这种情况就是变量嵌套了。
比如设变量word为“abcdefghij”,变量num为“eee4eeeee” %word:~4,1%为e,其中4可以从变量num中取值,即%num:~3,1%,写成组合形式如下: %word:~%num:~3,1%,1% 经测试这种写法不能正确执行,那么,怎么实现这种变量嵌套呢?首先,我们将其中的%num:~3,1%作为正常的字符处理命令,其它部分当成一般字符串,这样首尾的%就必须写成%%了,即%%word:~%num:~3,1%,1%% 但是上面的写法同样不能直接当成命令执行,必须运用命令嵌套才能执行。
什么是命令嵌套呢?简单的说,首先用一条dos命令生成一个字符串,而这个字符串是另一条dos命令,用call语句调用字符串将其执行,从而得到最终结果。
例:用call语句实现命令嵌套 @echo off set str1=aaa echo ok bbb echo 初始字符串:%str1% echo 生成命令字符串如下: echo %str1:~4,7% echo 运行命令字符串生成最终结果为: call %str1:~4,7% pause
运行显示:
初始字符串:aaa echo ok bbb 生成命令字符串如下: echo ok 运行命令字符串生成最终结果为: ok 请按任意键继续. . .
变量嵌套与命令嵌套结合运用,见下例。 @echo off
set num=Redtek 2006 bbs.cn-dos.net set a=123245 set b=87754321
echo. echo a=%a% b=%b% num=%num% set result=%%%%%%%%num:~%%%%b:~%a:~3,1%,1%%%%,4%%%%%%%% echo 直接运行命令,只解析第一层变量,其余的当作字符串:%result%
call set result=%%%%%%%%num:~%%%%b:~%a:~3,1%,1%%%%,4%%%%%%%% echo 一层命令嵌套,可解析两层变量,其余的当作字符串:%result%
call call set result=%%%%%%%%num:~%%%%b:~%a:~3,1%,1%%%%,4%%%%%%%% echo 两层命令嵌套,可解析三层变量,其余的当作字符串:%result%
call call call set result=%%%%%%%%num:~%%%%b:~%a:~3,1%,1%%%%,4%%%%%%%% echo 三层命令嵌套,运行变量解析完后的字符串:%result%
pause
十四、文件内容筛选(type和findstr命令结合使用)
Find常和type命令结合使用 Type [drive:][path]filename | find "string" [>tmpfile] #挑选包含string的行 Type [drive:][path]filename | find /v "string" #剔除文件中包含string的行 Type [drive:][path]filename | find /c #显示文件行数 以上用法将去除find命令自带的提示语(文件名提示)
FIND [/V] [/C] [/N] [/I] [/OFF[LINE]] "string" [[drive:][path]filename[ ...]]
/V 显示所有未包含指定字符串的行。 /C 仅显示包含字符串的行数。 /N 显示行号。 /I 搜索字符串时忽略大小写。 /OFF[LINE] 不要跳过具有脱机属性集的文件。 "string" 指定要搜索的文字串, [drive:][path]filename 指定要搜索的文件。
如果没有指定路径,FIND 将搜索键入的或者由另一命令产生的文字。
find命令不能处理文件中超过1024个字符的数据行,此时可用findstr命令。(见前面介绍)
FINDSTR [/B] [/E] [/L] [/R] [/S] [/I] [/X] [/V] [/N] [/M] [/O] [/F:file] [/C:string] [/G:file] [/D:dir list] [/A:color attributes] [/OFF[LINE]] strings [[drive:][path]filename[ ...]]
/B 在一行的开始配对模式。 /E 在一行的结尾配对模式。 /L 按字使用搜索字符串。 /R 将搜索字符串作为一般表达式使用。 /S 在当前目录和所有子目录中搜索 匹配文件。 /I 指定搜索不分大小写。 /X 打印完全匹配的行。 /V 只打印不包含匹配的行。 /N 在匹配的每行前打印行数。 /M 如果文件含有匹配项,只打印其文件名。 /O 在每个匹配行前打印字符偏移量。 /P 忽略有不可打印字符的文件。 /OFF[LINE] 不跳过带有脱机属性集的文件。 /A:attr 指定有十六进位数字的颜色属性。请见 "color /?" /F:file 从指定文件读文件列表 (/ 代表控制台)。 /C:string 使用指定字符串作为文字搜索字符串。 /G:file 从指定的文件获得搜索字符串。 (/ 代表控制台)。 /D:dir 查找以分号为分隔符的目录列表 strings 要查找的文字。 [drive:][path]filename 指定要查找的文件。
除非参数有 /C 前缀,请使用空格隔开搜索字符串。 例如: 'FINDSTR "hello there" x.y' 在文件 x.y 中寻找 "hello" 或 "there" 。 'FINDSTR /C:"hello there" x.y' 文件 x.y 寻找 "hello there"。
一般表达式的快速参考: . 通配符: 任何字符 * 重复: 以前字符或类别出现零或零以上次数 ^ 行位置: 行的开始 $ 行位置: 行的终点 [class] 字符类别: 任何在字符集中的字符 [^class] 补字符类别: 任何不在字符集中的字符 [x-y] 范围: 在指定范围内的任何字符 \x Escape: 元字符 x 的文字用法 \<xyz 字位置: 字的开始 xyz\> 字位置: 字的结束
有关 FINDSTR 常见表达法的详细情况,请见联机命令参考。
|