ラベル バッチ の投稿を表示しています。 すべての投稿を表示
ラベル バッチ の投稿を表示しています。 すべての投稿を表示

2017年11月29日水曜日

バッチで自身のパスに移動する

バッチファイル自身のパスに移動する理由


バッチファイルをダブルクリックで実行した場合には、バッチファイルのパスがカレントディレクトリになります。
しかし、コマンドラインから実行した場合には、実行場所がカレントディレクトリになってしまいます。

基本的には、問題ないのですが、
バッチファイルから相対パスにあるバッチファイルを呼び出す場合には、自分自身の場所を知っておく必要があります。

コマンド

cd %~dp0

※cd コマンドで /dを追加するとドライブの移動も可能。
cd /d %~dp0

説明


「%0」や「%1」・・・には、引数が渡されています。その中で、「%0」はバッチファイル自身のパスが含まれています。

「~」チルダは、そのパスの「”」ダブルクォーテーションを取り除きます。
「d」は、ドライブ名「C:\」を表示します。
「p」は、パス名を表示します。

2017年11月8日水曜日

ビルドイベントでの複数コマンドの実行



VisualStudioのビルドイベントで、ビルド前や、ビルド後にコマンドを実行することができます。
その際に、複数のツールを実行したい場合には、ツールの戻り値を見たいケースが出てきます。
単純に
consoleApp.exe
consoleApp2.exe
と記載すると、1つ目が失敗しても、2つ目のアプリで正常な戻り値が返ってしまうと、ビルドが継続してしまいます。
errorlevelの変数を記載することで、1つ目が失敗した場合にビルドエラーにすることができます。


consoleApp.exe
if %errorlevel% == 0 consoleApp2.exe

2017年11月7日火曜日

複数ファイル内の文字列をまとめて置換2

前回は、固定文字に変換していましたが、
文字列ごとに指定文字にするように変更しました。

Option Explicit
Dim objFileSys 'FileSystemオブジェクト
Dim strReadFile '置換ファイル
Dim strWriteFile
Dim objRead 'ファイルオブジェクト
Dim objWrite 'ファイルオブジェクト
Dim strRep,strRepBase
Dim strLine '読み込んだテキスト
Dim index 'ファイルループ
Set objFileSys = CreateObject("Scripting.FileSystemObject")
strReadFile = Wscript.Arguments(0)
Wscript.Echo strReadFile

strWriteFile= objFileSys.BuildPath (objFileSys.GetParentFolderName (WScript.ScriptFullName), objFileSys.GetTempName ())
Set objRead =objFileSys.OpenTextFile(strReadFile,1,false)
Set objWrite=objFileSys.OpenTextFile(strWriteFile,2,true)
Do Until objRead.AtEndOfStream = true
    strLine=objRead.ReadLine()
For index=1 To Wscript.Arguments.Count-1 Step 2
strRep = Wscript.Arguments(index+1)
strLine = Replace(strLine, Wscript.Arguments(index), strRep)
Next
    objWrite.WriteLine strLine
Loop
 
objRead.Close
objWrite.Close
objFileSys.DeleteFile strReadFile
objFileSys.MoveFile strWriteFile,strReadFile
Set objFileSys = Nothing
Set objRead = Nothing
Set objWrite = Nothing

2017年11月6日月曜日

複数ファイル内の文字列をまとめて置換

複数のファイル内の文字列をまとめて置換するVBScriptを作ったので、覚書。
一部、非公開の文字列を隠したいがために、作成してみました。

ファイルは、batファイルと、vbsファイルの2つ。

フォルダー階層を回すときに、batのほうが便利だったので。。。

まずは、ファイル内の文字列を置換するScript(replace.vbs)
第一引数がファイルパス、それ以降が置換する文字列...

Option Explicit
Dim objFileSys 'FileSystemオブジェクト
Dim strReadFile '置換ファイル
Dim strWriteFile
Dim objRead 'ファイルオブジェクト
Dim objWrite 'ファイルオブジェクト
Dim strRep,strRepBase
Dim strLine '読み込んだテキスト
Dim index 'ファイルループ
Set objFileSys = CreateObject("Scripting.FileSystemObject")
strReadFile = Wscript.Arguments(0)
Wscript.Echo strReadFile
strRepBase = "Reserved"

strWriteFile= objFileSys.BuildPath (objFileSys.GetParentFolderName (WScript.ScriptFullName), objFileSys.GetTempName ())
Set objRead =objFileSys.OpenTextFile(strReadFile,1,false)
Set objWrite=objFileSys.OpenTextFile(strWriteFile,2,true)
Do Until objRead.AtEndOfStream = true
    strLine=objRead.ReadLine()
For index=1 To Wscript.Arguments.Count-1
strRep = strRepBase & CStr(index)
strLine = Replace(strLine, Wscript.Arguments(index), strRep)
Next
    objWrite.WriteLine strLine
Loop

objRead.Close
objWrite.Close
objFileSys.DeleteFile strReadFile
objFileSys.MoveFile strWriteFile,strReadFile
Set objFileSys = Nothing
Set objRead = Nothing
Set objWrite = Nothing

次は、バッチファイル
for文で、.txtのファイルを古パスでvbsに渡します。
置換する文字列は、「秘密の言葉」、「内緒の言葉」、「見ちゃいや」です。

for /R  %%A in (*.txt) do cscript replace.vbs "%%~fA" "秘密の言葉" "内緒の言葉" "見ちゃいや"
pause

2016年8月31日水曜日

WindowsでのScriptで配列を利用(Powershell,VBS)

前回、バッチファイルで配列もどきを書いてみました。
書けることは書けたのですが、ものすごく面倒だったので、
Windows標準で使用できるスクリプトで書き直してみました。


VBSでの配列

Option Explicit
Dim values
Dim index
values = Array("value0", "value1", "value2", "value3", "value4")
For index = LBound(values) To UBound(values)
    WScript.Echo values(index)
Next


PowerShellでの配列

$values = @("value0","value1","value2","value3","value4")
for ($i = 0; $i -lt $values.Length; $i++) {
    Write-Host($values[$i])
}

バッチでの配列

@echo off
set key[0]="value0"
set key[1]="value1"
set key[2]="value2"
set key[3]="value3"
set key[4]="value4"
for /L %%i in (0,1,4) do (
call echo %%key[%%i]%%
)


PowerShellは、あまり詳しく知りませんが、一番簡単に書けるかも。
ちなみに、googleのWebサーバーに、ファイルをアップロードしたところ、
batとvbsは、エラーになりましたが、ps1は大丈夫でした。

2016年8月30日火曜日

バッチで環境変数を配列としてfor文でまわす

バッチで環境変数を配列としてfor文でまわす


バッチファイルで環境変数を配列としては使用できません。
なので、配列っぽくしてみました。

callを使う場合

:----バッチファイルで配列(call 利用)----
@echo off
set key[0]="value0"
set key[1]="value1"
set key[2]="value2"
set key[3]="value3"
set key[4]="value4"
for /L %%i in (0,1,4) do (
call echo %%key[%%i]%%
)

setlocal ENABLEDELAYEDEXPANSION を使う場合

:----バッチファイルで配列(ENABLEDELAYEDEXPANSION)----
@echo off
set key[0]="value0"
set key[1]="value1"
set key[2]="value2"
set key[3]="value3"
set key[4]="value4"
setlocal ENABLEDELAYEDEXPANSION
for /L %%i in (0,1,4) do (
echo !key[%%i]!
)
endlocal

フォルダー内のファイルをバッチで環境変数を配列としてfor文でまわす

----バッチファイルで配列(ファイル一覧)----
@echo off
setlocal ENABLEDELAYEDEXPANSION
set cnt=0for /f %%i in ('dir /b C:\batfiles\*.bat') do (
set /A cnt=cnt+1
set files[!cnt!]="%%i"
)
for /L %%i in (0,1,%cnt%) do (call !files[%%i]!)