[ TOP ] > [ CommandPrompt 目次 ] > [ SYNTAX ]
[ ]
■ SYNTAX



■ 変数(Variable)
  :: 代入
  set VAR=aaa

  :: 展開
  echo %VAR%

  WARNING 
    :: [=] の前の space だめ
    set var =abc

    :: [=] の後の space は OK ( ただし space も文字あつかい " abc" がセット  )
    set var= abc

    :: bash と同じく space を入れないのが無難
    set var=abc



    :: 遅延展開を有効にする
    setlocal ENABLEDELAYEDEXPANSION

    set a=foo

    if %a% == foo (

      set a=bar

      :: RET
      ::  foo
      echo %a%

      :: 遅延( 実行時 )展開
      :: RET
      ::  bar
      echo !a!

    ) 

■ 組込み変数(EmbededVariable)

  :: WORKING PATH
  ::   CurrentDirectory のチェックに便利
  echo %CD%

  :: C:\WINDOWS
  echo %SystemRoot%

  :: C:
  echo %SystemDrive%

  :: \Documents and Settings\usrname
  echo %HomePath%

  :: \Documents and Settings\usr
  echo %HOMEPATH%


  :: あなたがつけたコンピュータ名
  echo %HOSTNAME%

■ Command.の結合
SYNTAX cmdA && cmdB cmdA || cmdB

  :: コマンドの実行結果が真であれば, echo bbb を実行
  echo aaa && echo bbb

  cmd /c copy aa.txt bb.txt >nul && echo succeeded.

  cmd /c copy aa.txt bb.txt >nul || echo fail

  cmd /c echo aaa && echo succeeded.
 
■ Redirect
■ STDOUT
DESC cmd にも pipe という概念があるらしい REF Windows NTのコンソール
::
:: Redirect
:: 
echo aaa > d:/ret.txt

:: stderr のみ 
echo aaa 2> d:/ret.txt

:: stdout のみ
echo aaa 2> d:/ret.txt

:: stdout stdin を同じにする
echo aaa > d:/ret.txt  2>&1

■ 引数をとる(Argument)
  cnt.bat 1 2 3

  :: RET 1
  echo $1  

  :: RET 2
  echo $2

  :: RET 3
  echo $3  

  :: 全部とる
  :: RET 1 2 3
  echo %*

  :: Parameter の数をとる
  setlocal ENABLEDELAYEDEXPANSION
  for %%i in (%*) do set /a cnt=!cnt!+1
  echo パラメータ数は %cnt%
■ for
SYNTAX FOR %%変数 IN (セット) DO command [param] FOR /L %%変数 IN (開始,ステップ,終了) DO command [param] DESC (Set) 内のトークンを変数にセットしてひとつずつコマンドで処理する WARNING %変数 ではなく %%変数 でないとだめ

    :: 連番 Directory をつくる
    for %%i in (1 2 3) do mkdir test_%%i

    :: RET: 1 2 3 4 5
    FOR /L %%i IN (1,1,5) DO echo %%i

    :: RET: 1 2 3 4 5
    FOR /L %%i IN (5,-1,1) DO echo %%i


SYNTAX FOR /F "eol=; tokens=2,3* delims=, " %%i in (file) do @echo %%i %%j %%k DESC file の各行を delims で区切り, 指定した tokens を変数にバインドして 処理をする

    ; foo.csv
    aaa,bbb,ccc
    111,222,333


    :: RET:
    ::    aaa
    ::    111
    FOR /F "tokens=1 delims=," %%i in (foo.csv) DO echo %%i


    :: 区切り文字  [,] [ ] 
    FOR /F "tokens=1 delims=, " %%i in (foo.csv) DO echo %%i


    :: 2, 3 番目 Token を変数 i, j に Bind
    FOR /F "tokens=2,3 delims=," %%i in (foo.csv) DO echo %%i %%j

    
    :: Comment 文字 [;] より後ろは SKIP
    FOR /F "eol=; tokens=1 delims=," %%i in (foo.csv) DO echo %%i
       
■ if
SYNTAX // {} でないよ ! () だよ ! IF [NOT] ERRORLEVEL 番号 code IF [NOT] 文字列1==文字列2 code IF [NOT] EXIST ファイル名 code IF defined 変数 ( code ) [else code ] DESC http://fireball.loafer.jp/kes/windows/article_104.html http://pasofaq.jp/windows/command/normal.htm#nameid38 比較演算子

    :: 文字列の比較 ( if でもいいはず )
    IF var == 7 ( 
      echo "same" 
    ) ELSE (
      echo "different" 
    )


    :: Insentive ( 大文字, 小文字は無視 )
    if /I Test == test (
      echo 同じ
    ) else (
      echo 違う
    )

    :: 文字列が数値のみなら 数値に変換されて大小比較
    if 10 LSS 12 (
      echo 10 は 12 より小さい
    ) else (
      echo false
    )


    EQU - 等しい
    NEQ - 等しくない
    LSS - より小さい
    LEQ - 以下
    GTR - より大きい
    GEQ - 以上



    :: directory の有無をチェック
    IF exist dir (

    ) ELSE (

    )

    :: file の有無をチェック
    IF exist dir (

    ) ELSE (

    )

    :: 変数が定義されているかどうかチェック
    IF defined v ( echo Def ) ELSE ( echo NotDef )

    :: 環境変数があるかどうか
    IF defined USERNAME ( echo Def %USERNAME% ) ELSE ( echo NotDef )


  WARNING
    :: 以下の記述だめかも
    if aaa == aaa 
    (
       echo "same"
    )
    
    :: 引数が空だと 問題あり ( bash 同様 )

    :: BAD
    ::    コマンドの構文が間違っています
    if aaa == %5 (
      echo same
    )
    :: OK
    if aaa == "%5" (
      echo same
    )



ELSE 節は IF の後のコマンドと同じ行におく

      BAD
        :: C のようにかけない
        :: "ELSE" を命令として勘違いするらしい
        IF EXIST filename. (
            del filename. 
        ) 
        ELSE (
          echo filename. missing.
        )

      OK
        IF EXIST filename. (
            del filename.
        ) ELSE (
            echo filename. missing.
        )

      :: 一行にするのも OK
      IF EXIST filename. (del filename.) ELSE echo filename. missing

■ String
■ 長さ
DESC 関数などで調べる方法はないらしい 部分文字を抽出して調べる
   set x=12345678
   set y=%x:~8%

   if defined y echo 9文字以上


   set x=12345678
   set y=%x:~8%

   if defined y echo 9文字以上
   set z=%x:~7%
   if defined z echo 8文字以上

   if defined z if not defined y echo 8文字
■ 抽出
SYNTAX %var:~OFFSET,LENGTH%

  :: 0 番目 から 2 つ
  :: RET: ai
  set var=aiueo
  echo %var:~0,2%


  :: 後ろから 4 つ目より後
  :: RET: .txt
  set var=foo.txt
  echo %var:~-4%


  :: 後ろから 4 つを消す
  :: RET: foo
  set var=foo.txt
  echo %var:~0,-4%


  :: 2 番目から後ろ
  :: RET: ueo
  set var=aiueo
  echo %var:~2%


  :: Argument の展開は失敗する
  ::    別変数にセットしてからする
  
  :: BAD
  set pathbody=%1:~0,-4%

  :: OK
  tmp=%1
  set ret=%tmp:~0,-4%



  :: 結合は 展開の結果をそのまま使う
 set a=tunoda
 set b=hiro

 echo %a%%b%

■ Math(算術演算)
SYNTAX set /a exp DESC exp を 数式として評価する
  :: 右辺を 数式として評価する

  :: RET: 3
  set /a var=1 + 2
  echo %var%

  :: RET: 1
  set /a var=( 1 + 12 ) % 3

■ quot
  // VS でもできる 
  "copy $(TARGET)"

  // <  をはく
  echo ^< 

  :: SAPCE があるときは ["] で quot する ( ややこしい ! )
  :: BAD 
  c:/Program Files/foo/test.exe
  :: OK
  "c:/Program Files/foo/test.exe"


  :: ["] は 引数には含まれない -> やっぱり含まれる ? 

  test.bat  "argument"
  /pro/bat/arg.bat "argument"

  :: BAD
  C:\Program" "Files\Windows" "Media" "Player\wmplayer.exe /play C:\mymus\Morning.wpl
  :: OK
  "C:\Program Files\Windows Media Player\wmplayer.exe"  /play C:\mymus\Morning.wpl

■ Drive.のきりかえ

  :: [:] を忘れずに, 大文字 小文字はどちらでも OK

  :: BAD 
  d

  :: OK
  d:
  :: OK
  D:
■ Comment
REM comment rem comment :: comment
■ 文字.Code
WARNING sjis-unix では 日本語はダメかも

[ TOP ] > [ CommandPrompt 目次 ] > [ SYNTAX ]
[ ]

イライラ解消!エクセル即効ワザ99 仕事が早く終わる完ぺき修得本


イライラ解消!エクセル即効ワザ99 仕事が早く終わる完ぺき修得本

NINJAIDX 0