Windows」カテゴリーアーカイブ

robocopyの戻り値を利用したエラーチェック

Windowsで利用できるrobocopyコマンドでデータのバックアップをしていると、CLIで実行するコマンドゆえにエラーの発生に気づきにくいことがあります。

robocopyは処理完了後に内容に応じた戻り値を出力するので、エラーの発生した戻り値が出ている時のみ何らかの処理を追加することで、エラーに気づきやすくすることが可能です。

戻り値の一覧は以下の通りです。

サーバー 2008 またはサーバー 2008 R2 Windows Robocopy ユーティリティでWindowsコード

[Microsoft Docs]

より詳しい情報としては以下の記事が参考になります。

Robocopy のエラー (戻り値) について

[Microsoft Technet]


8以上がエラーを含むコードなので、簡単にエラーチェックだけをしたいなら8以上で通知にしておけば良さそうです。

コードの例です。Powershellにrobocopyコマンドを組み込んで使っていますので、戻り値は$LASTEXITCODEという変数に格納されます。この変数を評価して、8以上だった場合にはWrite-Hostコマンドでログを確認するよううながす表示をするようにしています。

#Powershell
#コピー元コピー先の設定
$CopyFrom = [コピー元]
$CopyDest = [コピー先]

#データコピー
Robocopy $CopyFrom $CopyDest /S /R:5 /W:0 /LOG+:log.txt

#エラー判定
If($LASTEXITCODE -ge 8){
    Write-Host("エラーが発生しました。ログを確認して下さい。")
    
    Pause
}

動かすとこんな感じになります。外出中や寝ている間に動かしておいても、この窓が出ていなければ正常終了している、窓がある場合何らかのエラーがあったことが確認できて便利です。

Windows11発表

Windowsに関する大きい発表があるという予告がされていましたが、発表されたのはWindows11でした。

Windows 11発表。年内提供予定でWindows 10からは無償アップグレード

[PC Watch]

各新機能については以下の動画が分かりやすいと思います。

色々と新機能が盛り込まれていますが、内部的にWindows10とどのくらいの差異があるものなのかは気になるところです。変更点の多い機能アップデート相当のものなのか、それともWindowsの内部バージョンが”10.0″から変わるのか興味があります。

あわせて組織で現在Windows10を運用している場合、機能アップデートのようにWSUSなどからアップグレードすることができるのかも確認しておきたいところです。今後の続報が待たれます。

色々ある新機能の中でピックアップすると、Microsoft Storeの刷新は注目だと思います。正直Microsoftの思ったように活用されていない感のあるストアですが、W32アプリをそのまま配布できること、またAndroidアプリを配布・実行できるようになることでストアに目を向けるユーザが増えるかもしれません。

モバイルOSのアプリインストールはできるけど、Windowsの”インストーラを入手してアプリケーションをインストールする”という形式は難しく感じる、というユーザもいるでしょうから、そういったユーザにモバイルOSライクな使い心地を提供できるようなら良いのではないかと思います。

最近は機能アップデートもそれほど大掛かりなものが無く少々寂しかったですが、久々に色々と変化がありそうで楽しみです。

自己昇格するバッチファイルを作成する

PCにあまり詳しくない人にバッチファイルを実行してもらう時に困るのが、”管理者実行”の問題です。コマンドの内容によっては管理者権限で実行しないといけないものもあるのですが、事前に説明しておいても右クリックして管理者実行してもらえないというケースがよくあります。

ネットで調べてみると、バッチファイルの書き方次第ではバッチファイル自身が権限を昇格してコマンドを実行できるような書き方ができるようなので、試してみました。

管理者権限の判定

今バッチファイルが管理者権限・ユーザ権限どちらで実行されているかを判断するには、openfilesコマンドを使います。

このコマンドは現在開かれている共有フォルダや共有ファイルを列挙するコマンドなのですが、管理者権限がないと実行できません。

ユーザ権限で実行した場合は変数errorlevelに1、管理者権限で実行した場合は0が格納されるので、これを権限の判定に使用します。

自己昇格

自分自身の権限を昇格して実行するには、powershellの力を借ります。powershellでよく使う”start-process hogehoge -verb runas”という管理者でプロセス実行する文がありますが、ここで実行するプロセスにコマンドプロンプトの変数である”%~0”を使用します。

%~0はバッチファイル自身を意味する変数で、これにより自分自身を再度管理者権限で実行することができます。

表示上の一工夫

最初に権限確認のため実行するopenfilesですが、実行結果が1枚目のコマンドプロンプトに表示されてしまいます。ちょっとうっとうしいのでこれを表示させないために、結果を標準ログにまとめて捨ててしまいます。

記述としては”openfiles > NUL 2>&1”となり、”2>&1”の部分が「エラーログを標準ログにまとめる」の意で、”>NUL”の部分が「出力を捨てる」という意味合いになります。

なので、口語に直すと「openfilesの出力を捨てる。ただし、エラーログと標準ログはまとめる」といった感じになります。ちなみに”>NUL”と”2>&1”の順序を逆にすると普通に結果が画面に出力されてきますのでご注意下さい。

できあがったバッチファイル

[bat]
@echo off

rem openfilesを実行して実行権限を判定できる数値をerrorlevelに格納する
rem このopenfilesの結果はウインドウに出力しない
openfiles >NUL 2>&1 

rem errorlevelの値が1(ユーザ権限)だった場合は管理者権限により自身を再実行
if %errorlevel% equ 1 (
	powershell start-process %~0 -verb runas
) else (
	rem 実行したい処理(例としてopenfiles)
	openfiles
)

参考情報

こちらのサイトの情報が大変参考になりました。ありがとうございました。

How to check in a batch file if you are running it elevated

[winaero.com]

Robocopyのバッチファイルが文字化けして失敗する問題

Robocopyのコピージョブをバッチファイル化して運用する時に、文字化けしてコピーが失敗する場合があります。ジョブを直接cmd.exeで実行した時には問題ないのにバッチファイルにするとうまくいかないという場合、テキストファイルの文字コードの問題である可能性が高いです。

これは”C:\ほげ”から”C:\ぴよ”にコピーをするジョブですが、このようにパスが文字化けしてコピーが失敗します。

Robocopyのジョブを作成する時にテキストエディタでジョブを書いて拡張子を変更してバッチファイル化することがありますが、Windows付属の”メモ帳”でテキストファイルを書くとデフォルトの文字コードがUTF-8で保存されます。

ところが、バッチ実行時の標準文字コードはShift-JISなので、そのままだとUTF-8のテキストをShift-JISで解釈することになってしまい2バイト文字で文字化けが発生するというわけです。

対策としてはメモ帳ではなく何らかのテキストエディタを使い、テキストファイル保存時に文字コードを明示的にShift-JISに設定してあげればOKです。

2021/04/28追記:メモ帳でも”名前をつけて保存”を選択することで文字コードを指定できるそうです。(情報提供:kentax様)

初歩的なミスだとは思いますが、普段自分が触っていない環境だとテキストエディタが入っていなかったりするのでこの手のトラブルが起きがちです。注意したいところです。

ATOK for Windowsのプログラムが2019年2月に更新予定

月額契約のATOK Passportで提供されているATOK for Windowsのプログラムが、2019年2月に新機能の追加込みで更新されるそうです。

ジャストシステム、説明で漢字変換できる新機能を搭載した新「ATOK for Windows」

[PC Watch]

毎年一太郎の新バージョンが2月頃に出るので、それに対応したアップデートのようです。新機能として漢字そのものの説明を入力することにより目的の漢字に変換ができる漢字絞り込み変換と、難読地名を読んだまま入力すると正しく入力できる地名入力変換が追加されているそうです。

漢字絞り込み変換は一見面倒そうですが、旧字体や姓名に使う異体字を入力する際には便利そうに思います。地名入力変換の方は個人的にどこまでマイナーな難読地名に対応しているか試してみたくなります。

Microsoft To-Doの紹介

長らくメモ用アプリとしてはGoogle Keepを使っていたのですが、主な利用目的が買い物メモだったのでMicrosoft To-Doを試してみています。

Web版Microsoft To-Do

[Microsoft.com]

Microsoft To-Doはその名の通りのTo-Do管理アプリなのですが、リスト方式で管理をしているので買い物メモにも使えます。

気に入っているところというのはプラットフォームがUWPアプリ、ブラウザ、Android、iOSと多岐にわたっており、それぞれでの同期が非常に高速なことです。

Office365やSkypeなどを使っている場合は、メールやインスタントメッセージからタスクを生成することもできるそうなので、MS製品の利用が多ければ特に便利なのではないかと思います。Web版はかなり気軽に試せるのでオススメです。

アプリケーション終了時に特定の処理をする

Windows環境でアプリケーション終了時に特定の処理(今回の場合はファイル操作)をする必要があり、方法を考えていました。

何か難しい方法を採用しないといけないのかと思っていましたが、普通にバッチファイルに両方の処理を書くだけでOKということが分かりました。

例えば、

[実行ファイルのパス]/hoge.exe

del [フォルダのパス]/piyo.txt

と2行で構成されたバッチファイルを作れば、hoge.exeを実行し、終了時にpiyo.txtを削除するという要件を満たすことができます。hoge.exeを実行する際にはこのバッチファイルを実行するようにすればOKというわけです。

プロセスの名前やIDを調べてその終了を検知する…というような複雑なことをしないといけないと勝手に思い込んでいましたが、意外に解決策は簡単でした。

新型ATOKの発表会

2018/02/01に新しいATOKがリリースになるそうです。

【速報】新ATOK、パッケージ版廃止で月額制のみに

[PC Watch]

PC Watchさんの記事の見出しにもある通り、2018年のバージョンからはいわゆるパッケージ版の販売がなくなり、月額契約のATOK Passportに一本化されるそうです。

私は約11ヶ月ほどATOK Passportをベーシックプランで利用していますが、税込み286円/月で常に最新のATOKが使えることを考えると、それなりに説得力のある価格設定なのではないかと思っています。

こんな感じで毎日ささやかなエントリを書いていますが、この程度の文章でもATOKを使ってタイピングすると細かいストレスなく文章作成ができるので、価値があるものと思います。

契約しておくとWindows以外にAndroidでも使うことができるので、スマートフォンの文字入力でも役立ちます。

毎月費用が発生するという点は確かに心理的な抵抗がありますが、日々文字入力をする機会がある方ならATOK Passportを試す価値は大いにあると思います。

 

ATOK Passport由来と思われるメモリ保護違反エラー

最近Windowsをシャットダウンする寸前に

”hoge”の命令が ”piyo”のメモリを参照しました。メモリが”written”になることはできませんでした… (hogeやpiyoには実際にはメモリ番地と思われる情報が入ります)

というメモリ保護違反エラーが出るので気になっていました。動作上の支障はないのですが、あまりこういうエラーが出るのは気分の良くないものです。

毎回ではなかったのですが、エラーダイアログのタイトルを見るとATOK関連の何らかの実行ファイルで発生しているような情報が読み取れました。

そこでATOK Passportを一旦アンインストールし、再度インストールしたところ、同様のメモリ保護違反エラーは出なくなりました。その後もしばらく継続して使っていますが、今のところエラーは出ていません。

この手のエラーは原因の究明が難しいのですが、エラーダイアログのタイトルに表示されるファイル名はかなりのヒントになるのではないかと思います。ファイル名がある程度特定できるようであれば、再インストールやアンインストールで対応できるのではないかと思います。

Googleドライブの設定を誤ったことによる容量オーバー

メンテナンスのため、PCに入っているGoogleドライブ用の同期アプリ、”Googleのバックアップと同期”を再インストールしました。

私はいつもGoogleドライブで同期するフォルダの場所をデフォルトから変更しているので、いつものように所定のフォルダに変更する旨を設定してセットアップしたつもりだったのですが、しばらくして容量不足のエラーが出て驚きました。

調べてみると、Googleドライブの同期フォルダと思って設定したのは”マイパソコン”という区分のフォルダでした。

よく確認してみると

  • マイパソコン:Windowsの ドキュメント や ピクチャ などユーザが任意にバックアップしたいフォルダを設定
  • Googleドライブ:いわゆるGoogleドライブと同期するフォルダを設定(デフォルトではシステムディスク内に設定)

となっているようでした。

私の想定していた用途では

  • マイパソコン:何も設定しない
  • Googleドライブ:同期するローカルのパスを設定

にするべきでした。今回はマイパソコン側にGoogleドライブでバックアップしていたファイル一式を設定してしまったので、クラウド側が各ファイルを2個ずつバックアップすることになり、容量オーバーになったようです。