作者: Neo

Powershell : Run as Administrator from command.

Powershell : Run as Administrator from command.

如果你想要從Command(命令提示字元)直接執行Powershell然後使用管理員模式,你必須使用下列方式執行Command (命令提示字元) 。

下方的命令是打在Dos Command裡。


1
Powershell -Command Start-Process powershell -ArgumentList '-File C:\ABC.ps1' -Verb runAs

原理上是透過命提示字元(一般身分)先呼叫Powershell.exe(一般身分)去執行Powershell(管理員身分)來跑 ABC.PS1程序
圖解大概是這樣子:
Command > Powershell.exe > Powershell – file ABC.ps1

以前搞不懂怎麼弄的時候常常要用一個Bat + PS1 + PS1(Admin)三個檔案來湊成一組功能,也比較不好維護,現在這方式可以把中繼的PS1拿掉,只要Bat+PS1(Admin)就可以完成任務了。

PowerShell : 印表機管理(增/刪/設定)

PowerShell : 印表機管理(增/刪/設定)

在以前的批次檔年代,實在太難利用它來做印表機的管理了。
有了PowerShell,想一次利用PS來大量佈署重複的印表機,或是一次想增刪多部印表機真的方便又快速。在這裡稍微說明一下。

印表機的安裝大致上分成:驅動程式>Port>印表機。
利用PowerShell新增印表機,一定要按照上面的順序做
pnputil.exe – 驅動程式
Add-PrinterDriver – 驅動程式
Add-PrinterPort – Port
Add-Printer – 印表機
所以,在辦公室要用指令安裝印表機大致上會非常兩種
1.透過印表機伺服器來安裝/列印
2.電腦直連印表機(USB/Ethernet)

無論你是透過哪一種方式使用印表機,你想用PS來新增印表機之前,你的電腦都必要先有驅動程式。它分為兩階段。我以HP Universal Printing PCL 6 為例
Driver Name必須要一字不差用””包起來。Driver可以從印表機的伺服器內印表機的伺服器內容裡看到。(前提是你要有裝過)

要新增Driver分兩階段。
第一階段是把印表機驅動新增到Windows Driver Store裡面。用的是pnputil.exe 的程式。後面下參數/add-driver和驅動程式路徑、/install,即可新增並安裝。


1
pnputil /add-driver "D:\Tools\HPUPD6.6.5\pcl6-x64-6.6.5.23510\*.inf" /install

第二階段是把剛剛新增驅動程式新增到印表機的伺服器驅動程式裡方便使用


1
Add-PrinterDriver -Name "HP Universal Printing PCL 6 (v6.6.5)"

驅動程式作業完成之後,就可以來新增印表機了。
如前述,先講第一種透過印表機伺服器的方式來安裝印表機
直接使用Add-Printer 加上ConnectionName即可。如果Server上的驅動和你已經安裝過的驅動相同就會直接套用你現有的。


1
Add-Printer -ConnectionName "\\10.0.0.1\HPLaserJet C300DN"

如果有錯誤找不到驅動,請自行加上 -DriverName參數


1
Add-Printer -ConnectionName "\\10.0.0.1\HPLaserJet M607" -DriverName "HP Universal Printing PCL 6 (v6.6.5)"

這種效果就如同你透過網路找到印表機伺服器之後直接點兩下來安裝印表機

再來就是透過Local Port或是TCP/IP的方式來安裝印表機。這種則必須先建立好PrinterPort再新增印表機,Add-PrinterPort需要Name參數指定名稱,-PrinterHostAddress指定印表機IP位址是直連印表機的。


1
Add-PrinterPort -Name "ABC001" -PrinterHostAddress "10.0.0.10"

再來就是利用Add-Printer來新增印表機,使用Name印表機名稱、PortName指定剛剛新增的Port、DriverName指定前面剛剛新增的驅動程式、Comment則可有可無,裡面可以放註解說明


1
Add-Printer -Name "HP LaserJet M607" -PortName ABC001 -DriverName "HP Universal Printing PCL 6 (v6.6.5)" -Comment "ABC001"

如此一來就可以透過PowerShell來一次新增很多印表機(例如Server上)

不過如果你有指定印表機的紙匣/顏色/紙張Size還是必須透過圖形介面去調整。
我猜測也可以透過變更機碼方式來直接修改,不過那個比較複雜下次再研究吧!

如果印表機變更IP,也很容易可以快速替換。首先要確定印表機沒有列印工作正在執行。依照下面的順序來執行,新增Printer Port,修改Printer裡面PrinterPort的設定,然後把舊的PrinterPort移除。


1
2
3
Add-PrinterPort -Name XYZ001 -PrintHostAddress "10.0.0.100"
Set-Printer -Name "HP LaserJet M607" -PortName XYZ001
Remove-PrinterPort -Name ABC001

最後是移除印表機的部分,順序與安裝印表機相反。
如果是移除連線到透過伺服器的連線的印表機下面的方式就可以直接移除。


1
Remove-Printer -Name \\10.0.0.1\ABC001

如果想連驅動程式一併移除 。執行下面的也可一併移除


1
Remove-PrinterDriver -Name "HP Universal Printing PCL 6 (v6.6.5)"

再來是說明移除直連的印表機
想移除的很乾淨,就是先移除Printer,移除PrinterPort,移除印表機驅動程式


1
2
3
Remove-Printer -Name "HP LaserJet M607"
Remove-PrinterPort -Name XYZ001
Remove-PrinterDriver -Name "HP Universal Printing PCL 6 (v6.6.5)"

最後說明,可以透過下面指令查詢目前的狀態


1
2
3
Get-Printer #查詢目前印表機
Get-PrinterPort #查詢所有安裝的印表機Port
Get-PrinterDriver #查詢所安裝的印表機驅動程式
Adobe Reader DC找不到預設Mail Client

Adobe Reader DC找不到預設Mail Client

某些情況下Adobe Reader DC 會找不到預設的郵件程式,例如:Microsoft Outlook之類的。

此時,需要系統的預設程式裡去重新Apply一次設定
以Windows 10為範例,到設定裡去找依應用程式設定預設值

先點Set this program as default,然後再點Choose defaults for this progeam

1809前的Windows畫面

確認都有打勾,按Save

1903後的Windows確認每個功能都有選到預測的郵件應用程式

然後回頭來Adobe Reader DC設定裡面就可以看到預設郵件程式出現在裡面了

這樣有某些PDF會用到Javascript呼叫預設郵件程式寄信的時候就不會發生錯誤了。

手機照片分享

手機照片分享

下面分享的照片都是用iPhone Xs 和 Pixel 3a拍攝的。Pixel 3a拍起照來真令人驚豔!可能是Google的演算法真的有一套!僅作縮圖沒有後製。

Powershell : 偵測Java版本並修改Bat檔/發送信件

Powershell : 偵測Java版本並修改Bat檔/發送信件

會寫出這一段程式,是因為廠商的程式無法改變的情況下,我們只好自己動手了。
起因是,廠商寫了一個Bat檔案,他是用Java執行的,他的程式執行到某些功能會去呼叫這個bat去做某些動作,來看看這個bat(我修改某修路徑避免洩密之嫌)


1
2
3
4
5
6
7
@echo off

echo "PlugIn starting..."

call setenv.bat

"C:\Program Files (x86)\Java\jre1.8.0_181\bin\java.exe" -Xmx512m -DLogConfig=%LogConfig% -DSSL=N -cp %CLASSPATH% -Djava.library.path=%LIB_PATH% -Dfile.encoding=utf-8 com.XXXXXXXX.pl.hdl.PlugInHandler %1%

各位看倌有看到嗎?他把Java路徑寫死了。只要Java一升版(Java升版經由總部派送,User無法得知什麼ˊ時候被更新了),這隻程式就會立刻沒有用。之前做過一隻替換程式,當User發現程式無法執行出現特錯誤的時候,跑一隻我寫的檢查和更新程式,來把bat檔替換掉就可以了。


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
#讀取WMI物件的作業系統版本
#開頭為10的,為Windows10
#開頭為6的,為Window7
[String]$OS = ((Get-CimInstance win32_OperatingSystem).version).split(".",2)[-2]
[String]$Waitkey = "Job finish. Press Enter to exit:::"
[Bool]$CheckABC = Test-Path "D:\ABC\DEF\GHI"
Switch($OS)
{
    10
        {
            Write-host "Your OperatingSystem is Windows 10 X64"
            $javaver= dir "HKLM:\SOFTWARE\WOW6432Node\JavaSoft\Java Runtime Environment"  | select -expa pschildname -Last 1
            $Javaexpath = (Get-ItemProperty -path "HKLM:\SOFTWARE\WOW6432Node\JavaSoft\Java Runtime Environment\$Javaver" -Name JavaHome).JavaHome

        }
    6
        {
            Write-host "Your OperatingSystem is Windows 7 X86"
            $javaver= dir "HKLM:\SOFTWARE\JavaSoft\Java Runtime Environment"  | select -expa pschildname -Last 1
            $Javaexpath = (Get-ItemProperty -path "HKLM:\SOFTWARE\JavaSoft\Java Runtime Environment\$Javaver" -Name JavaHome).JavaHome
        }
}
Write-Host "Your Java Version is $javaver"
Write-Host "Your Java path in $Javaexpath\bin"  
Write-Host "Replace your PlugInHandler.bat with PlugInHandler-$OS-$Javaver.bat."
IF($CheckABC -eq $True)
{
    Copy-Item -Path \\2.3.4.5\AAA\ D:\ABC\DEF\GHI\\PlugInHandler*.* -Destination D:\ABC\DEF\GHI\ -Force
    Copy-Item -Path D:\\ABC\DEF\GHI\PlugInHandler-$OS-$Javaver.bat -Destination D:\\ABC\DEF\GHI\PlugInHandler.bat -Force
}
Else
{
   Write-Host "You don't have ABC"
}
Read-Host $Waitkey

稍微解釋一下,先判斷Windows 7 / 10,因為系統路徑不同
讀取機碼找到最新的Java安裝版本,然後根據系統版本找到預先做好對應版本的bat檔,直接替換檔案並更名。整隻其實只是判斷JRE的版本然後直接替換而已

所以也是要等User自己發現有問題再跑上來點。少了主動通知的功能。這次因為有一台無人值守的公用電腦,被總部派送Java更新之後,廠商的程式就故障了,故障之後連帶影響日常自動化作業,因此,必須另外寫一隻程式來偵測版本更新並且自動發Mail通知我們。
整個Powershell是會放在工作排程裡每30分鐘執行檢查一次,如有發現版本不對就立刻發送郵件到指定信箱,每天的九點不管正不正常都會發送一次通知Mail來得知排程有在正常運行。


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
$PlugInHanderPath = "D:\ACB\DEF\GHI\PlugInHandler.bat"                                                                                                 #檔案路徑
$PlugInHanderstring = Get-Content -Path $PlugInHanderPath | Where-Object { $_.Trim() -ne '' }                                                                    #讀取檔案內容去除空白
$PlugInHanderJvPath=$PlugInHanderString |select -Last 1 |%{$_.split('"')[1]}                                                                                     #讀取最末行找出路徑
$javaver= dir "HKLM:\SOFTWARE\WOW6432Node\JavaSoft\Java Runtime Environment"  | select -expa pschildname -Last 1
$Javaexpath = (Get-ItemProperty -path "HKLM:\SOFTWARE\WOW6432Node\JavaSoft\Java Runtime Environment\$Javaver" -Name JavaHome).JavaHome + "\bin\java.exe"
$OS = gwmi win32_operatingsystem | Select -ExpandProperty Version
$SKU = gwmi win32_operatingsystem | Select -ExpandProperty OperatingSystemSKU
$min = Get-Date '09:00'
$max = Get-Date '09:30'
$now = Get-Date

$Sender = 'abc@def.com'
$RecipientAPM = 'abc@def.com'
$RecipientNor = 'abc@def.com'
$Subject = "Java version check."
$IP = Get-NetIPAddress | Where-Object -FilterScript { $_.ValidLifetime -Lt ([TimeSpan]::FromDays(1)) }| Select -ExpandProperty IPAddress

Switch ($SKU)
{
4
    {$Branchver = "CBB"}
125
    {$Branchver = "LTSB/C"}
}
#Write-host "Your PlusInHander Java Excution Path is "$PlugInHanderJvPath
#Write-host "Your PC Java Execuction Path is "$Javaexpath

$BodyAlert = "<HTML><HEAD><META http-equiv=""Content-Type"" content=""text/html; charset=iso-8859-1"" /><TITLE></TITLE></HEAD>"
$BodyAlert += "<BODY bgcolor=""#ffffff"" style=""font-family: Frutiger, Calibri, times; color: #000000""><P>"
$BodyAlert += "<img src=""https://connect.dhl.com/cmsmedia/ImageLibrary/DPDHL-GROUP-ITS-yellow-bar-600.png"" alt=""Deutsche Post DHL Group IT Services""><BR>"
$BodyAlert += "Hi DGF TW IT Teams<BR><BR>"
$BodyAlert += "<font color=red>Warning!</font><BR> GICHIQ PlugInHander batch file Java is different with system Java Enviorment.<BR>Please go to update.<BR>"
$BodyAlert += "<TABLE style=""background: #e5e5e5;font-weight: normal;font-family: Frutiger, Calibri, times;""><TR><TD>GICHIQ Java Excution Path :</TD><TD><font color=red>$PlugInHanderJvPath</font></TD><TR><TD></TD><TD></TD></TR>"
$BodyAlert += "<TR><TD>System Java Execuction Path :</TD><TD><font color=red>$Javaexpath</font></TD><TR><TD></TD><TD></TD></TR>"
$BodyAlert += "<TR><TD>Computer Name :</TD><TD>$env:COMPUTERNAME</TD></TR><TR><TD></TD><TD></TD></TR>"
$BodyAlert += "<TR><TD>OS Verserion :</TD><TD>Windows $OS $Branchver</TD></TR><TR><TD></TD><TD></TD></TR>"
$BodyAlert += "<TR><TD>Domain/Username :</TD><TD>$env:USERDOMAIN\$env:USERNAME</TD></TR><TR><TD></TD><TD></TD></TR>"
$BodyAlert += "<TR><TD>IP Address :</TD><TD>$IP</TD></TR></TABLE><BR>"
$BodyAlert += "Thank you.<BR><BR>"
$BodyAlert += "Your IT Team."

$BodyNormal = "<HTML><HEAD><META http-equiv=""Content-Type"" content=""text/html; charset=iso-8859-1"" /><TITLE></TITLE></HEAD>"
$BodyNormal += "<BODY bgcolor=""#ffffff"" style=""font-family: Frutiger, Calibri, times; color: #000000""><P>"
$BodyNormal += "<img src=""https://connect.dhl.com/cmsmedia/ImageLibrary/DPDHL-GROUP-ITS-yellow-bar-600.png"" alt=""Deutsche Post DHL Group IT Services""><BR>"
$BodyNormal += "Hi DGF TW IT Teams<BR><BR>"
$BodyNormal += "GICHIQ PlugInHander batch file Java is same with system Java Enviorment.<BR>"
$BodyNormal += "<TABLE style=""background: #e5e5e5;font-weight: normal;font-family: Frutiger, Calibri, times;""><TR><TD>GICHIQ Java Excution Path :</TD><TD><font color=red>$PlugInHanderJvPath</font></TD><TR><TD></TD><TD></TD></TR>"
$BodyNormal += "<TR><TD>System Java Execuction Path :</TD><TD><font color=red>$Javaexpath</font></TD><TR><TD></TD><TD></TD></TR>"
$BodyNormal += "<TR><TD>Computer Name :</TD><TD>$env:COMPUTERNAME</TD></TR><TR><TD></TD><TD></TD></TR>"
$BodyNormal += "<TR><TD>OS Verserion :</TD><TD>Windows $OS $Branchver</TD></TR><TR><TD></TD><TD></TD></TR>"
$BodyNormal += "<TR><TD>Domain/Username :</TD><TD>$env:USERDOMAIN\$env:USERNAME</TD></TR><TR><TD></TD><TD></TD></TR>"
$BodyNormal += "<TR><TD>IP Address :</TD><TD>$IP</TD></TR></TABLE><BR>"
$BodyNormal += "Thank you.<BR><BR>"
$BodyNormal += "Your IT Team."

If($PlugInHanderJvPath -ne $Javaexpath)
{
    [System.Windows.MessageBox]::Show('Java verson not match. Please update GICHIQ','GICHIQ Java version check','OK','Error')
    Send-MailMessage -From $Sender -To $RecipientAPM -Subject $Subject -SmtpServer KULDCCAS1.dhl.com -bodyashtml -Body $BodyAlert
}
ELSE
{
    [System.Windows.MessageBox]::Show('Java verson match.','GICHIQ Java version check','OK','Information')
    IF($min.TimeOfDay -le $now.TimeOfDay -and $max.TimeOfDay -ge $now.TimeOfDay)  #Send mail between 09:00-09:30 , Mail should be send on 09:00
    {
        Send-MailMessage -From $Sender -To $RecipientNor -Subject $Subject -SmtpServer KULDCCAS1.dhl.com -bodyashtml -Body $BodyNormal
    }

}

我來分段解釋一下

這三個只為了將上面的批次檔裡C:\Program Files (x86)\Java\jre1.8.0_181\bin\java.exe,抽取出來,準備跟系統的版本做比對。
由於這批次檔裡面有摻查一些空白,所以做法是讀出檔案內容之後,把多餘的前後空白和空白列Trim掉,然後利用這個”符號來做分段,取出第一段字也就是我要的路徑


1
2
3
$PlugInHanderPath = "D:\GICHIQ\GICEDI\PLUG-IN\PlugInHandler.bat"                                                                                                
$PlugInHanderstring = Get-Content -Path $PlugInHanderPath | Where-Object { $_.Trim() -ne '' }          
$PlugInHanderJvPath=$PlugInHanderString |select -Last 1 |%{$_.split('"')[1]}

下面兩個利用讀取機碼的方式來判斷系統安裝最新的版本
然後組合字串來準備比對


1
2
$javaver= dir "HKLM:\SOFTWARE\WOW6432Node\JavaSoft\Java Runtime Environment"  | select -expa pschildname -Last 1
$Javaexpath = (Get-ItemProperty -path "HKLM:\SOFTWARE\WOW6432Node\JavaSoft\Java Runtime Environment\$Javaver" -Name JavaHome).JavaHome + "\bin\java.exe"

下面兩個是抓取系統版本用的


1
2
$OS = gwmi win32_operatingsystem | Select -ExpandProperty Version
$SKU = gwmi win32_operatingsystem | Select -ExpandProperty OperatingSystemSKU

下面三個是準備判斷時間的,9:00-9:30之間才會發送正常報告


1
2
3
$min = Get-Date '09:00'
$max = Get-Date '09:30'
$now = Get-Date

下面是準備信件內容的變數
$sender : 送件者(同時是該台電腦的登入帳號所屬的Email)
$RecipientAPM : 有異常時要發給的對象
$RecipientNor : 正常時每天九點發送的對象
$Subject : 主旨
$IP取得這一台電腦的IP位址


1
2
3
4
5
$Sender = 'abc@def.com'
$RecipientAPM = @('aaa@def.com','bbb@def.com')
$RecipientNor = @('ccc@def.com','ddd@def.com')
$Subject = "Public PC Java version check."
$IP = Get-NetIPAddress | Where-Object -FilterScript { $_.ValidLifetime -Lt ([TimeSpan]::FromDays(1)) }| Select -ExpandProperty IPAddress

下面是準備判斷Windows是CBB/LTSB(C)版本,用於信件內容


1
2
3
4
5
6
7
Switch ($SKU)
{
4
    {$Branchver = "CBB"}
125
    {$Branchver = "LTSB/C"}
}

下面是警告信件的內容,HTML格式


1
2
3
4
5
6
7
8
9
10
11
12
$BodyAlert = "<HTML><HEAD><META http-equiv=""Content-Type"" content=""text/html; charset=iso-8859-1"" /><TITLE></TITLE></HEAD>"
$BodyAlert += "<BODY bgcolor=""#ffffff"" style=""font-family: Frutiger, Calibri, times; color: #000000""><P>"
$BodyAlert += "Hi DGF TW IT Teams<BR><BR>"
$BodyAlert += "<font color=red>Warning!</font><BR>PlugInHander batch file Java is <font color=red><b>different</b></font> with system Java Enviorment.<BR>Please go to update.<BR>"
$BodyAlert += "<TABLE style=""background: #e5e5e5;font-weight: normal;font-family: Frutiger, Calibri, times;""><TR><TD>Java Excution Path :</TD><TD><font color=red>$PlugInHanderJvPath</font></TD><TR><TD></TD><TD></TD></TR>"
$BodyAlert += "<TR><TD>System Java Execuction Path :</TD><TD><font color=red>$Javaexpath</font></TD><TR><TD></TD><TD></TD></TR>"
$BodyAlert += "<TR><TD>Computer Name :</TD><TD>$env:COMPUTERNAME</TD></TR><TR><TD></TD><TD></TD></TR>"
$BodyAlert += "<TR><TD>OS Verserion :</TD><TD>Windows $OS $Branchver</TD></TR><TR><TD></TD><TD></TD></TR>"
$BodyAlert += "<TR><TD>Domain/Username :</TD><TD>$env:USERDOMAIN\$env:USERNAME</TD></TR><TR><TD></TD><TD></TD></TR>"
$BodyAlert += "<TR><TD>IP Address :</TD><TD>$IP</TD></TR></TABLE><BR>"
$BodyAlert += "Thank you.<BR><BR>"
$BodyAlert += "Your IT Team."

下面是正常每日報告信的內容


1
2
3
4
5
6
7
8
9
10
11
12
$BodyNormal = "<HTML><HEAD><META http-equiv=""Content-Type"" content=""text/html; charset=iso-8859-1"" /><TITLE></TITLE></HEAD>"
$BodyNormal += "<BODY bgcolor=""#ffffff"" style=""font-family: Frutiger, Calibri, times; color: #000000""><P>"
$BodyNormal += "Hi DGF TW IT Teams<BR><BR>"
$BodyNormal += "GICHIQ PlugInHander batch file Java is <b>same</b> with system Java Enviorment.<BR>"
$BodyNormal += "<TABLE style=""background: #e5e5e5;font-weight: normal;font-family: Frutiger, Calibri, times;""><TR><TD>Java Excution Path :</TD><TD><font color=red>$PlugInHanderJvPath</font></TD><TR><TD></TD><TD></TD></TR>"
$BodyNormal += "<TR><TD>System Java Execuction Path :</TD><TD><font color=red>$Javaexpath</font></TD><TR><TD></TD><TD></TD></TR>"
$BodyNormal += "<TR><TD>Computer Name :</TD><TD>$env:COMPUTERNAME</TD></TR><TR><TD></TD><TD></TD></TR>"
$BodyNormal += "<TR><TD>OS Verserion :</TD><TD>Windows $OS $Branchver</TD></TR><TR><TD></TD><TD></TD></TR>"
$BodyNormal += "<TR><TD>Domain/Username :</TD><TD>$env:USERDOMAIN\$env:USERNAME</TD></TR><TR><TD></TD><TD></TD></TR>"
$BodyNormal += "<TR><TD>IP Address :</TD><TD>$IP</TD></TR></TABLE><BR>"
$BodyNormal += "Thank you.<BR><BR>"
$BodyNormal += "Your IT Team.

接著才是程式主體,
如果版本異常,直接發送信件。
版本正確而且時間落在9:00-9:30之間送發送一次報告


1
2
3
4
5
6
7
8
9
10
11
12
13
14
If($PlugInHanderJvPath -ne $Javaexpath)
{
    #[System.Windows.MessageBox]::Show('Java verson not match. Please update ABC','Java version check','OK','Error')
    Send-MailMessage -From $Sender -To $RecipientAPM -Subject $Subject -SmtpServer KULDCCAS1.dhl.com -bodyashtml -Body $BodyAlert -Priority High
}
ELSE
{
    #[System.Windows.MessageBox]::Show('Java verson match.','Java version check','OK','Information')
    IF($min.TimeOfDay -le $now.TimeOfDay -and $max.TimeOfDay -ge $now.TimeOfDay)  
    {
        Send-MailMessage -From $Sender -To $RecipientNor -Subject $Subject -SmtpServer KULDCCAS1.dhl.com -bodyashtml -Body $BodyNormal
    }

}

下面是版本正常的信件

下面是異常時發出的通知。同時在Outlook收到時,會看到前面有驚嘆號!

其實如果串上前面的更新程式,是可以做到全自動化的,偵測到版本變動時直接替換或用Set-Content方式去修改bat的內容。但是,到頭來說一句話,都全自動的話我們就失業了,,,,,,

Powershell : Check time between a range to execute something.

Powershell : Check time between a range to execute something.

這是我這陣子在研究一段客製化的PS時候意外找到。


1
2
3
4
5
6
7
8
$str = Get-Date '09:25'
$end = Get-Date '09:30'
$now = Get-Date

if ($str.TimeOfDay -le $now.TimeOfDay -and $end.TimeOfDay -ge $now.TimeOfDay)
{
  Write-host "OK"
}

我想應該不用解釋太多。

$str : 設定開始時的時間
$end : 設定結束的時間
$now : 現在
如果開始的時間(9:25)<=現在的時間,同時結束的時間(9:30)>=現在的時間
就執行裡面的內容

附帶說明,可以替換的
-eq 等於
-ne 不等於
-ge 大於等於
-gt 大於
-lt 小於
-le 小於等於
-like Wildcard模糊比對(字元數字) – Wildcard comparison
-notlike Wildcard模糊比對(字元數字) – Wildcard comparison
-match 比對格式 – Regular expression comparison
-notmatch 比對相似 – Regular expression comparison
-replace 替換 -Replace operator
-contains Containment operator
-notcontains Containment operator
-in 類似於 -comtains,但是相反是動作
-notin 類似於 -notcontains ,但是是相反動作
 
Powershell : Map a New Network Drive and  show in external environment(File Explorer).

Powershell : Map a New Network Drive and show in external environment(File Explorer).

有使用過Dos Command的應該都是知如何建立網路磁碟機。


1
Net use z: \\Fileserver\XXX

這很方面可以做成Script放在很多地方也行之有年了。
但是對於Powershell有偏執的,盡可能都會希望可以使用PS來執行一切的工作。

使用New-PSDrive可以建立網路磁碟機


1
New-PSDrive -Name Z -PSProvider FileSystem -Root "\\Fileserver\XXX" -persist

但是,指令下完之後,檔案總管沒有任何動靜,在Powershell的視窗內去輸入Z:又能看到,使用Get-PSDrive,也能看到Z。原來是因為Powershell預設建立的網路磁碟機只能用在這個Session內,外面的世界(檔案總管….)是看不到的而且也不永久的。

我一開始以為-Persist,這個參數是可以讓PS所建立的磁碟機顯現出來,無奈怎麼試都沒有辦法。

找了一陣子終於被我發現,原來是另外一個參數 -Scope,所以實際上應該要把上面的只改成如下


1
New-PSDrive -Name Z -PSProvider FileSystem -Root "\\Fileserver\XXX" -persist -Scope Global

這樣,外面的世界就能夠看的到了。