ã¯ããã«
ãã®èšäºã¯ãPowerShellã®åºæ¬ã«æ¢ã«ç²Ÿéããstackexchangeã§ããã€ãã®ã¹ã¯ãªãããå®è¡ããããããæ¥åžžã®äœæ¥ã容æã«ããããã®ããŸããŸãªã¹ãããããå«ãç¬èªã®ããã¹ããã¡ã€ã«ãæã£ãŠãã人ã察象ãšããŠããŸãã ãããæžãç®çã¯ããšã³ããããŒãæžãããäŒç€Ÿã§äœ¿çšãããŠããPowerShellã³ãŒãã®å¯èªæ§ãšä¿å®æ§ãé«ãããã®çµæãããã䜿çšãã管çè
ã®çç£æ§ãé«ããããšã§ãã

以åã®ä»äºã®å Žæã§ã¯ãã¿ã¹ã¯ã®è©³çްãšäžçã®äžå®å
šãã®ããã«ãPowerShellã§äœæ¥ããã¹ãã«ã倧ãã«æŽ»æ°ã¥ããŸããã äœæ¥ã®å€æŽåŸããã®çš®ã®è² è·ã¯åçã«æžå°ããæã®è§ãæ²ãã£ããšããã«ãããã®ã¯ãã¹ãŠãæ°ããæè¡ã§æ°ããåé¡ã解決ããçµéšã®äžã§ãŸããŸãæ·±ãæ²ã¿å§ããŸããã ãã®ããšããããã®èšäºã¯ããèªäœã宣èšããŠããããšã ãã䞻匵ããŠãããç§ã®æèŠã§ã¯ããã®ããŒã«ã®ç¥ãåããå§ãŸã£ãã°ããã®çŽ7幎åã«èªåã«ãšã£ãŠåœ¹ç«ã€ãããã¯ã®ãªã¹ããæããã«ããŠããŸãã
PowerShellããªããžã§ã¯ãæåã·ã§ã«ã§ããçç±ãããããåŸãããããŒãã¹ãããã³ãªããããå¿
èŠãªã®ããçè§£ããŠããªãå Žåã嫿ªæã®å«ã³ã«ããããããããã®ç°å¢ã®æ¬è³ªããã°ãã玹ä»ããè¯ãæ¬ããå§ãããŸã-Andrey Vladimirovich PopovãIntroduction to Windows PowerShell ã ã¯ããããã¯å€ãããŒãžã§ã³ã®PSã«ã€ããŠã§ããã¯ããèšèªã¯ããã€ãã®æ¡åŒµãšæ¹åãç²åŸããŸãããããã®ç°å¢ã®éçºã®åææ®µéã説æãããšããããã¯åºæ¬çãªããšã ããç¡æèã«åŒ·èª¿ããã®ã§ããã®æ¬ã¯è¯ãã§ãã ç°å¢ã倧ãããªããããæ§æç³ã¯ãæŠå¿µãã©ã®ããã«æ©èœããããçè§£ããããšãªããããã«ãããç¥èŠããŸãã ãã®æ¬ãèªããšãæåéãæ°æ©ã®å€ã¹ã«ãªããèªãã åŸã«æ»ã£ãŠããŸãã

æ¬ã¯èè
ã®ãŠã§ããµã€ãã§ãå
¥æã§ããŸããããã®äœ¿çšãã©ã®ããã«ã©ã€ã»ã³ã¹ãããŠãããã¯ããããŸããïŒ https : //andpop.ru/courses/winscript/books/posh_popov.pdf
ã¹ã¿ã€ã«ã¬ã€ã
ã¹ã¿ã€ã«ã¬ã€ãã«åŸã£ãŠã¹ã¯ãªãããèšèšããããšã¯ããã®é©çšã®ãã¹ãŠã®å Žåã«ãããŠè¯ãç¿æ
£ã§ããã2ã€ã®æèŠã¯ã»ãšãã©ããåŸãŸããã ããã€ãã®ãšã³ã·ã¹ãã ã¯ãã€ãã£ããã¥ãŒãã³ã°ã®ã¬ãã«ã§ãããåŠçããŠãããPythonã³ãã¥ããã£ã§ã¯pep8ãGolangã§ã¯go fmtãæããã«ãªããŸãã ãããã¯éåžžã«è²Žéãªæéç¯çŽããŒã«ã§ãããæ®å¿µãªãããæšæºã®PowerShellããã±ãŒãžã«ã¯ååšããªããããåé¡ãé ã«ç§»ããŸãã çŸåšãçµ±äžãããã³ãŒããã©ãŒãããã®åé¡ã解決ããå¯äžã®æ¹æ³ã¯ãã¹ã¿ã€ã«ã¬ã€ããæºããã³ãŒããç¹°ãè¿ãèšè¿°ããããšã§åå°ç¥çµãéçºããããšã§ãïŒå®éããããïŒã
Microsoftã«ãã£ãŠå
¬åŒã«æ¿èªããã詳现ã«èª¬æãããŠããªãããã®ã¹ã¿ã€ã«ã¬ã€ãã¯ãPowerShell v3ã®æä»£ã«ã³ãã¥ããã£ã§èªçãããã以æ¥githubã®ãªãŒãã³ãã©ãŒã ã§éçºãããŠããŸãïŒ PowerShellPracticeAndStyle ã ããã¯ãPowerShell iseã§ãä¿åããã¿ã³ã䜿çšããããšããã人ã«ãšã£ãŠæ³šç®ãã¹ããªããžããªã§ãã
ã¹ã¯ã€ãŒãºãè¡ãããšãããšãããããæ¬¡ã®ç¹ã«ãªããŸãã
- PowerShellã¯PascalCaseã䜿çšããŠã倿°ãã³ãã³ãã¬ãããã¢ãžã¥ãŒã«åãããã³æŒç®åãé€ãã»ãšãã©ãã¹ãŠã«ååãä»ããŸãã
if
ã switch
ã break
ã process
ã -match
ãªã©ã®èšèªæŒç®åã¯éåžžã«å°ããªæåã§æžãããŠããŸãã- äžãã£ãã¯ãKernigan and Richieã¹ã¿ã€ã«ãšãåŒã°ããå¯äžã®çã®æ¹æ³ã§é
眮ããã Cããã°ã©ãã³ã°èšèªãããã®ã¹ããŒãªãŒãå°ããŸãã
- ã€ã³ã¿ã©ã¯ãã£ãã³ã³ãœãŒã«ã»ãã·ã§ã³ä»¥å€ã®å Žæã§ã¯ãšã€ãªã¢ã¹ã䜿çšããªãã§ãã ãããã¹ã¯ãªãããã¡ã€ã«ã«
ps | ? processname -eq firefox | %{$ws=0}{$ws+=$_.workingset}{$ws/1MB}
æžã蟌ãŸãªãã§ãã ããps | ? processname -eq firefox | %{$ws=0}{$ws+=$_.workingset}{$ws/1MB}
ps | ? processname -eq firefox | %{$ws=0}{$ws+=$_.workingset}{$ws/1MB}
ps | ? processname -eq firefox | %{$ws=0}{$ws+=$_.workingset}{$ws/1MB}
; - æç€ºçãªãã©ã¡ãŒã¿ãŒåãæå®ãããšãã³ãã³ãã¬ããã®åäœãšãã®çœ²åãå€ããå ŽåããããŸã ãããã«ãããç¹å®ã®ã³ãã³ãã¬ããã«äžæ
£ããªãŠãŒã¶ãŒã«ã³ã³ããã¹ãã远å ãããŸãã
- ã¹ã¯ãªãããåŒã³åºãããã®ãã©ã¡ãŒã¿ãäœæããã¹ã¯ãªããå
ã«é¢æ°ãèšè¿°ããªãã§ãã ãããæåŸã®è¡ã¯ããã©ã¡ãŒã¿ãæå®ãã代ããã«ã°ããŒãã«å€æ°ã®å€ã倿Žããå¿
èŠããããã®é¢æ°ãåŒã³åºããŸãã
- [CmdletBindingïŒïŒ]ãæå®ããŸã-ããã«ãããã³ãã³ãã¬ããã«
-Verbose
ãã©ã°ãš-Debug
ãã©ã°ãããã³ãã®ä»ã®å€ãã®äŸ¿å©ãªæ©èœãæäŸãããŸã ã ã³ãã¥ããã£å
ã®äžéšã®çŽç²äž»çŸ©è
ã®ç¢ºåºããå°äœã«ãããããããç§ã¯åçŽãªã€ã³ã©ã€ã³é¢æ°ãšãªãã©ã«ã®æ°è¡ãããªããã£ã«ã¿ãŒã§ãã®å±æ§ã瀺ãããšãæ¯æããŠããŸããã - ã³ã¡ã³ãããŒã¹ã®ãã«ããäœæããŸãã1ã€ã®æããã±ãããªã³ã¯ãåŒã³åºãäŸã
#requires
ã»ã¯ã·ã§ã³ã§å¿
èŠãªPowerShellã®ããŒãžã§ã³ãæå®ããŸããSet-StrictMode -Version Latest
䜿çšãããšã 以äžã§èª¬æããåé¡ãåé¿ã§ããŸã ã- ãã°ãåŠçããŸãã
- PowerShellã§ãã¹ãŠãæžãçŽãããšããªãã§ãã ããã PowerShellã¯äž»ã«ã·ã§ã«ã§ããããã€ããªã®åŒã³åºãã¯ãã®çŽæ¥ã®ã¿ã¹ã¯ã§ãã ã¹ã¯ãªããã§robocopyã䜿çšããŠãåé¡ã¯ãããŸãã;ãã¡ãããrsyncã§ã¯ãããŸããããéåžžã«åªããŠããŸãã
以äžã¯ããã«ãã¹ã¯ãªãããååŸããæ¹æ³ã®äŸã§ãã ã¹ã¯ãªããã¯ãç»åãåè§ã«ãããµã€ãºã倿ŽããŸãããŠãŒã¶ãŒã®ã¢ãã¿ãŒãäœæããã¿ã¹ã¯ããããšæããŸãïŒããããexifããŒã¿ã«åŸã£ãå転ãé€ãïŒã .EXAMPLE
ã»ã¯ã·ã§ã³ã«äœ¿çšäŸããããŸãã詊ããŠãã ããã PowerShellã¯ãä»ã®ããããããèšèªãšåæ§ã«ãå
±éèšèªã©ã³ã¿ã€ã ã«ãã£ãŠå®è¡ããããããããããããã©ã€ãã©ãªã®ãã¹ãŠã®æ©èœã䜿çšã§ããŸãã
<# .SYNOPSIS Resize-Image resizes an image file .DESCRIPTION This function uses the native .NET API to crop a square and resize an image file .PARAMETER InputFile Specify the path to the image .PARAMETER OutputFile Specify the path to the resized image .PARAMETER SquareHeight Define the size of the side of the square of the cropped image. .PARAMETER Quality Jpeg compression ratio .EXAMPLE Resize the image to a specific size: .\Resize-Image.ps1 -InputFile "C:\userpic.jpg" -OutputFile "C:\userpic-400.jpg"-SquareHeight 400 #> # requires -version 3 [CmdletBinding()] Param( [Parameter( Mandatory )] [string]$InputFile, [Parameter( Mandatory )] [string]$OutputFile, [Parameter( Mandatory )] [int32]$SquareHeight, [ValidateRange( 1, 100 )] [int]$Quality = 85 ) # Add System.Drawing assembly Add-Type -AssemblyName System.Drawing # Open image file $Image = [System.Drawing.Image]::FromFile( $InputFile ) # Calculate the offset for centering the image $SquareSide = if ( $Image.Height -lt $Image.Width ) { $Image.Height $Offset = 0 } else { $Image.Width $Offset = ( $Image.Height - $Image.Width ) / 2 } # Create empty square canvas for the new image $SquareImage = New-Object System.Drawing.Bitmap( $SquareSide, $SquareSide ) $SquareImage.SetResolution( $Image.HorizontalResolution, $Image.VerticalResolution ) # Draw new image on the empty canvas $Canvas = [System.Drawing.Graphics]::FromImage( $SquareImage ) $Canvas.DrawImage( $Image, 0, -$Offset ) # Resize image $ResultImage = New-Object System.Drawing.Bitmap( $SquareHeight, $SquareHeight ) $Canvas = [System.Drawing.Graphics]::FromImage( $ResultImage ) $Canvas.DrawImage( $SquareImage, 0, 0, $SquareHeight, $SquareHeight ) $ImageCodecInfo = [System.Drawing.Imaging.ImageCodecInfo]::GetImageEncoders() | Where-Object MimeType -eq 'image/jpeg' # https://msdn.microsoft.com/ru-ru/library/hwkztaft(v=vs.110).aspx $EncoderQuality = [System.Drawing.Imaging.Encoder]::Quality $EncoderParameters = New-Object System.Drawing.Imaging.EncoderParameters( 1 ) $EncoderParameters.Param[0] = New-Object System.Drawing.Imaging.EncoderParameter( $EncoderQuality, $Quality ) # Save the image $ResultImage.Save( $OutputFile, $ImageCodecInfo, $EncoderParameters )
äžèšã®ã¹ã¯ãªããã¯è€æ°è¡ã®ã³ã¡ã³ã<# ... #>
ã§å§ãŸãããã®ã³ã¡ã³ããæåã«æ¥ãŠç¹å®ã®ããŒã¯ãŒããå«ãŸããŠããå ŽåãPowerShellã¯ã¹ã¯ãªããã®ãã«ããèªåçã«äœæããŸãã ãã®çš®ã®ãã«ãã¯æåéãåŒã°ããŸã- ã³ã¡ã³ãã«åºã¥ããã«ã ïŒ

ããã«ãã¹ã¯ãªãããåŒã³åºããããšãPowerShellã³ã³ãœãŒã«ã§ããã³ãŒããšãã£ã¿ãŒã§ããããã©ã¡ãŒã¿ãŒã®ããŒã«ããããæ©èœããŸãã

ããäžåºŠãç§ã¯åœŒå¥³ãç¡èŠãããã¹ãã§ã¯ãªããšããäºå®ã«æ³šæãåŒããŸãã ããªããããã«äœãæžãã¹ããããããªãå Žåã¯ãäœããæžããŠãã¯ãŒã©ãŒã«è¡ããæ»ã£ããšãã«ãæžããããã®ã§äœã倿Žããå¿
èŠããããã確å®ã«çè§£ããã§ãããã åäœããŸãã ãã¹ãŠã®ããŒã¯ãŒããç±ççã«å
¥åããªãã§ãã ãã.SYNOPIS
èªå·±ææžåããããã«èšèšãããŠããããã©ã¡ãŒã¿ãŒã«æå³ã®ãããã«ããŒã ãä»ããå Žåã .SYNOPIS
ã»ã¯ã·ã§ã³ã®çãæãš1ã€ã®äŸã§ååã§ãã
峿 Œã¢ãŒã
PowerShellã¯ãä»ã®å€ãã®ã¹ã¯ãªããèšèªãšåæ§ã«ãåçåä»ããåããŠããŸãã ãã®ã¿ã€ãã®ã¿ã€ãã³ã°ã«ã¯å€ãã®æ¯æè
ãããŸãïŒã·ã³ãã«ã ã匷åãªé«ã¬ãã«ã®ããžãã¯ãæžãããšã¯æ°åã§å®äºããŸãããæ±ºå®ãåè¡ã«éãããšããã®ã¢ãããŒãã®è匱æ§ã«å¿
ãééããŸãã
åžžã«èŠçŽ ã®ã»ãããåãåãå Žæã«é
åã圢æãããã¹ã段éã§åãèªåçã«åºåãããšã1ã€ã®èŠçŽ ãååŸããæ¬¡ã®æ¡ä»¶ã§èŠçŽ ã®æ°ããã§ãã¯ãã代ããã«ãæåã®æ°ãŸãã¯å¥ã®å±æ§ãååŸããŸãã¢ã€ãã ã®ã¿ã€ãã ã¹ã¯ãªããã®ããžãã¯ãå£ããã©ã³ã¿ã€ã ã¯ãã¹ãŠãæ£åžžã§ãããšèŠããããŸãã
ã¹ããªã¯ãã¢ãŒããèšå®ãããšããã®çš®ã®åé¡ãåé¿ã§ããŸããã倿°ã®åæåãæç€ºçãªãã£ã¹ããªã©ãããå°ãã³ãŒãã远å ããå¿
èŠããããŸãã
ãã®ã¢ãŒãã¯Set-StrictMode -Version Latest
ã³ãã³ãã¬ããã«ãã£ãŠæå¹ã«ãªããŸãããã峿 Œããã«ã¯ä»ã®ãªãã·ã§ã³ããããŸãããç§ã®éžæã¯åŸè
ã䜿çšããããšã§ãã
以äžã®äŸã§ã¯ãstrictã¢ãŒãã¯ååšããªãããããã£ãžã®åŒã³åºãããã£ããããŸãã ãã©ã«ããŒå
ã«ã¯èŠçŽ ã1ã€ãããªããããå®è¡ã®çµæãšããŠã®$Input
倿°ã®åã¯FileInfo
ã«ãªãã察å¿ããèŠçŽ ã®äºæ³ãããé
åã§ã¯ãããŸããã

ãã®ãããªåé¡ãåé¿ããã«ã¯ãã³ãã³ãã¬ããã®çµæãæç€ºçã«é
åã«ãã£ã¹ãããå¿
èŠããããŸãã
$Items = @( Get-ChildItem C:\Users\snd3r\Nextcloud )
åžžã«å³æ Œã¢ãŒããèšå®ããããšãã«ãŒã«ã«ããŠãã ãããããã«ãããã¹ã¯ãªããã®å®è¡ã«ããäºæããªãçµæãåé¿ã§ããŸãã
ãšã©ãŒåŠç
ErrorActionPreference
ä»ã®äººã®ã¹ã¯ãªãããããšãã°githubã調ã¹ããšããšã©ãŒåŠçã¡ã«ããºã ãå®å
šã«ç¡èŠãããããšã©ãŒãçºçããå Žåã«ç¶ç¶æäœã®ãµã€ã¬ã³ãã¢ãŒããæç€ºçã«ã¢ã¯ãã£ãã«ããããšããããããŸãã ãšã©ãŒåŠçã®åé¡ã¯ãäžè¬ã«ãç¹ã«ã¹ã¯ãªããã§ããã°ã©ãã³ã°ããã®ãæãç°¡åã§ã¯ãããŸããããééããªãç¡èŠããã«å€ãããã®ã§ã¯ãããŸããã ããã©ã«ãã§ã¯ããšã©ãŒãçºçããå Žåã®PowerShellã¯ãšã©ãŒã衚瀺ããŠåäœãç¶ããŸãïŒæŠå¿µãå°ãç°¡ç¥åããŸãããããã®ãããã¯ã«é¢ããgitããã¯ãžã®ãªã³ã¯ã§ãïŒã ããã¯ããã¡ã€ã³ã§åºã䜿çšãããŠããããã°ã©ã ã®æŽæ°ããã°ã©ã ããã¹ãŠã®ãã·ã³ã«ç·æ¥ã«é
åžããå¿
èŠãããå Žåã«äŸ¿å©ã§ãããã¹ãŠã®sccmå±éãã€ã³ãã«åºãããããŠãŒã¶ãŒã䜿çšããå¥ã®æ¹æ³ã§åºãããŸã§åŸ
ã€å¿
èŠã¯ãããŸããã ãã·ã³ã®1ã€ããªãã«ãªã£ãŠããå Žåãããã»ã¹ãäžæããŠåèµ·åããã®ã¯äžå¿«ã§ããããã¯äºå®ã§ãã
äžæ¹ãæ
å ±ã·ã¹ãã ã®è€æ°ã®éšåã®è€æ°ã®ããŒã¿ãã¡ã€ã«ã§æ§æãããã·ã¹ãã ã®è€éãªããã¯ã¢ãããäœæããå Žåãããã¯ã¢ããã®äžè²«æ§ãšãå¿
èŠãªãã¹ãŠã®ããŒã¿ã»ããããšã©ãŒãªãã§ã³ããŒãããããšã確èªããå¿
èŠããããŸãã
ãšã©ãŒãçºçããå Žåã®ã³ãã³ãã¬ããã®åäœã倿Žããã«ã¯ãã°ããŒãã«å€æ°$ErrorActionPreference
ããããæ¬¡ã®å€ã®ãªã¹ãããããŸãïŒ StopãInquireãContinueãSuspendãSilentContinue ã
ã¹ã¯ãªããã®æ°ãŸãã¯ãã®è€éããé ã®ã¹ã¿ãã¯ã«ä¿åãããªããªã£ãå Žåã¯ãåžžã«Stop
å€ã䜿çšããããšããå§ãããŸããäºæãã¬ç¶æ³ã§ã¯ãã¹ã¯ãªãããåäœã忢ããfireããéãã«ãäžæãããå®è¡ããæ£åžžã«ãçµäºããããšã確èªããããšããå§ãããŸãã
äœãåé¡ãçºçããå Žåã«ã¹ã¯ãªããã忢ããããšã«å ããŠããã®äœ¿çšã«ã¯å¥ã®åææ¡ä»¶ããããŸã-äŸå€çãªç¶æ³ãåŠçããŸãã ããã«ã¯try/catch
ã³ã³ã¹ãã©ã¯ãããããŸããããšã©ãŒã«ããå®è¡ã忢ããå Žåã«ã®ã¿æ©èœããŸãã ã¹ã¯ãªããå
šäœã®ã¬ãã«ã§åæ¢ãæå¹ã«ããå¿
èŠã¯ãããŸããErrorAction
ã¯ããã©ã¡ãŒã¿ãŒã䜿çšããŠã³ãã³ãã¬ããã¬ãã«ã§èšå®ããããšErrorAction
ã§ããŸãã
Get-ChildItem 'C:\System Volume Information\' -ErrorAction 'Stop'
å®éããã®å¯èœæ§ã¯2ã€ã®è«ççãªæŠç¥ãå®çŸ©ããŸãããã¹ãŠã®ãšã©ãŒããããã©ã«ãã§ã解決ãããšã©ãŒãåŠçããéèŠãªå Žæã«ã®ã¿ErrorAction
ãèšå®ããŸãã ã°ããŒãã«å€æ°ã®å€ãèšå®ããŠãã¹ã¯ãªããå
šäœã®ã¬ãã«ã§æå¹ã«ããããéèŠã§ãªãæäœã§-ErrorAction 'Continue'
ãèšå®ããŸãã ç§ã¯åžžã«2çªç®ã®ãªãã·ã§ã³ãéžæããŸããæ¥ãã§ããªãã«èª²ãããšã¯ãããŸããããã®åé¡ãçè§£ãããã®äŸ¿å©ãªããŒã«ã䜿çšããã®ã¯1åã ãã«ããããšããå§ãããŸã
詊ã/ãã£ãã
ãšã©ãŒãã³ãã©ãŒã§ã¯ãäŸå€ã®çš®é¡ããšã«äžèŽãããå®è¡ã®ã¹ã¬ããã§æäœããããããšãã°ãããå°ãæ
å ±ã远å ãããã§ããŸãã try/catch/throw/trap
æŒç®åã䜿çšãããšãã¹ã¯ãªããå®è¡ã®ãããŒå
šäœãæ§ç¯ã§ããŸãããå®è¡ã䌎ããã®ãããªæ¹æ³ã¯ãgoto-noodleãã«ããŽãªã®æ¥µç«¯ãªã¢ã³ããã¿ãŒã³ãšèŠãªãããã ãã§ã¯ãªãããããããæç¢ºã«åé¿ããå¿
èŠããããŸãããŸããããã©ãŒãã³ã¹ã倧å¹
ã«äœäžããŸãã
#requires -version 3 $ErrorActionPreference = 'Stop' # , , # $Logger = Get-Logger "$PSScriptRoot\Log.txt" # trap { $Logger.AddErrorRecord( $_ ) exit 1 } # $count = 1; while ( $true ) { try { # $StorageServers = @( Get-ADGroupMember -Identity StorageServers | Select-Object -Expand Name ) } catch [System.Management.Automation.CommandNotFoundException] { # , throw " Get-ADGroupMember , Active Directory module for PowerShell; $( $_.Exception.Message )" } catch [System.TimeoutException] { # if ( $count -le 3 ) { $count++; Start-Sleep -S 10; continue } # throw " - , $count ; $( $_.Exception.Message )" } # break }
trap
æŒç®åã¯ã°ããŒãã«ãšã©ãŒãã©ããã§ããããšã«æ³šæããŠãã ããã äžäœã¬ãã«ã§åŠçãããŠããªããã¹ãŠã®ãã®ããã£ããããããç¶æ³ãåå¥ã«ä¿®æ£ã§ããªãããã«äŸå€ãã³ãã©ãŒããã¹ããŒãããŸãã
äžèšã®äŸå€ã®ãªããžã§ã¯ãæåã®ã¢ãããŒãã«å ããŠãPowerShellã¯ããšã©ãŒãããŒããªã¿ãŒã³ã³ãŒãããšã©ãŒçޝç©å€æ°ãªã©ãä»ã®ãã¯ã©ã·ãã¯ãã·ã§ã«ãšäºææ§ã®ãããã銎æã¿ã®ããæŠå¿µãæäŸããŸãã ããã¯ç¢ºãã«äŸ¿å©ã§ãæã«ã¯äºãããªãããšããããŸãããå
šäœãšããŠãã®ãããã¯ã®ç¯å²ãè¶
ããŠããŸãã 幞ããªããšã«ããã®ããŒãã«é¢ããgithubã®è¯ãæ¬ããããŸãã
ãã¬ãŒã®ã³ãŒãã¯ãã·ã¹ãã ã«PowerShell 5ïŒãã¬ãŒã¯ã©ã¹ããã䟿å©ã«èšè¿°ããããšãã§ããïŒããããšãã確信ããªãå Žåã«äœ¿çšããŸãã詊ããŠã¿ãŠãã ããããã®ã·ã³ãã«ããšç°¡æœãããã圹ã«ç«ã€ããšããããŸãã远å ã®ã¡ãœãããç°¡åã«è¿œå ã§ããŸãã ïŒ
# " ", PowerShell v3 function Get-Logger { [CmdletBinding()] param ( [Parameter( Mandatory = $true )] [string] $LogPath, [string] $TimeFormat = 'yyyy-MM-dd HH:mm:ss' ) $LogsDir = [System.IO.Path]::GetDirectoryName( $LogPath ) New-Item $LogsDir -ItemType Directory -Force | Out-Null New-Item $LogPath -ItemType File -Force | Out-Null $Logger = [PSCustomObject]@{ LogPath = $LogPath TimeFormat = $TimeFormat } Add-Member -InputObject $Logger -MemberType ScriptMethod AddErrorRecord -Value { param( [Parameter( Mandatory = $true )] [string]$String ) "$( Get-Date -Format 'yyyy-MM-dd HH:mm:ss' ) [Error] $String" | Out-File $this.LogPath -Append } return $Logger }
ç§ã¯ãã®èããç¹°ãè¿ããŸã-ãšã©ãŒåŠçãç¡èŠããªãã§ãã ããã ããã¯é·æçã«ããªãã®æéãšç¥çµãç¯çŽããŸãã
äœããã£ãŠãã¹ã¯ãªãããå®è¡ãããšã¯æããªãã§ãã ããã è¯ã-itãå£ããã«èœã¡ãæã§ãã
ããŒã«
PowerShellã䜿çšããããã®ããŒã«ã®æ¹åãéå§ããã«ã¯ãééããªãã³ã³ãœãŒã«ãšãã¥ã¬ãŒã¿ãŒã䜿çšããå¿
èŠããããŸãã 代ããã®ã¹ãºã¡ããã®æ¯æè
ãããWindowsã®ã³ã³ãœãŒã«ãæªãããšãããã¯ãŸã£ããã³ã³ãœãŒã«ã§ã¯ãªããdosãªã©ã§ãããšããè³ã«ããŸããã ãã®äž»é¡ã«é¢ãã䞻匵ãé©åã«å®åŒåããããšã¯ã§ããŸããã§ãããã誰ããæåããå Žåãå®éã«ã¯ãã¹ãŠã®åé¡ã解決ã§ããããšã倿ããŸããã 端æ«ãšããã®ãŠã£ã³ããŠã«ã¯æ°ããã³ã³ãœãŒã«ã«é¢ããæ
å ±ããã§ã«ãããŸãããã ãã¹ãŠãããã«ãããŸãã
æåã®ã¹ãããã¯ConemuãŸãã¯ãã®Cmderã¢ã»ã³ããªãã€ã³ã¹ããŒã«ããããšã§ããããã¯ç¹ã«éèŠã§ã¯ãããŸããããšã«ããèšå®ãæ€èšãã䟡å€ãããããã§ãã ç§ã¯éåžžãgitaãä»ã®ãã€ããªã䜿çšããã«ãæå°éã®æ§æã§cmderãéžæããŸããæ°å¹Žã®éãçŽç²ãªConemuã®æ§æã調æŽããŸããã ããã¯æ¬åœã«ãŠã£ã³ããŠçšã®æé«ã®ã¿ãŒããã«ãšãã¥ã¬ãŒã¿ã§ãç»é¢ãåå²ïŒtmux /ã¹ã¯ãªãŒã³ã奜ããªäººåãïŒãã¿ããäœæãå°éã¹ã¿ã€ã«ã®ã³ã³ãœãŒã«ã¢ãŒããæå¹ã«ã§ããŸãã
ã³ãã

ã¢ãžã¥ãŒã«ãé
眮ããããšããå§ãããæ¬¡ã®ã¹ãããïŒ oh-my-posh ã posh-git ãããã³PSReadLine ã æåã®2ã€ã¯ãçŸåšã®ã»ãã·ã§ã³ãæåŸã«å®è¡ãããã³ãã³ãã®ã¹ããŒã¿ã¹ãç¹æš©ã€ã³ãžã±ãŒã¿ãŒãããã³çŸåšã®å Žæã®gitãªããžããªã®ã¹ããŒã¿ã¹ã«é¢ããæ
å ±ã远å ããããšã«ãããpromãããå¿«é©ã«ããŸãã PSReadLineã¯ãå
¥åãããã³ãã³ãã®å±¥æŽïŒCRTL + RïŒã®æ€çŽ¢ããCRTL + Spaceã®ã³ãã³ãã¬ããã®äŸ¿å©ãªãã³ããªã©ã远å ããŠãããã³ããã倧å¹
ã«åäžãããŸãã

ãããŠãã¯ããCTRL + Lã§ã³ã³ãœãŒã«ãã¯ãªã¢ã§ãã cls
ãå¿ããããšãã§ããŸãã
ããžã¥ã¢ã«ã¹ã¿ãžãªã³ãŒã
ãšãã£ã¿ãŒã PowerShellã«ã€ããŠç§ãèšããææªã®ããšã¯ãçŽç²ã«PowerShell ISEã§ãã3ã€ã®ããã«ãæã€æåã®ããŒãžã§ã³ãèŠã人ã¯ããã®çµéšãå¿ããããšã¯ã»ãšãã©ãããŸããã ã¿ãŒããã«ã®ç°ãªããšã³ã³ãŒãã£ã³ã°ãèªåã€ã³ãã³ããèªåã¯ããŒãºãã©ã±ãããã³ãŒãã®æžåŒèšå®ãçæãããã¢ã³ããã¿ãŒã³ã®ã»ãããªã©ãåºæ¬çãªãšãã£ã¿ãŒæ©èœã®æ¬ åŠïŒããã¯ISEã«ã€ããŠã§ãïŒã
䜿çšããªãã§ãã ãããPowerShellæ¡åŒµæ©èœãåããVisual Studio Codeã䜿çšããŠãã ãã-å¿
èŠã®ãªããã®ã¯ãã¹ãŠãããŸãïŒãã¡ãããåççãªå¶éå
ã§ãïŒã ãŸãã6çªç®ã®ããŒãžã§ã³ïŒPowerShell Core 6.0ïŒããåã®PoweShellã§ã¯ãã¹ã¯ãªããã®ãšã³ã³ãŒããUTF8 BOMã§ããããšãå¿ããªãã§ãã ãããããããªããšãã·ã¢èªãå£ããŸãã

ãã©ã°ã€ã³ã¯ãæ§æã®åŒ·èª¿è¡šç€ºãããŒã«ã®ãã³ããããã³ã¹ã¯ãªããã®ãããã°æ©èœã«å ããŠãã³ãã¥ããã£ã§ç¢ºç«ãããæ
£ç¿ã«åŸãã®ã«åœ¹ç«ã€ãªã³ã¿ãŒãã€ã³ã¹ããŒã«ããŸããããšãã°ãã¯ã³ã¯ãªãã¯ã§ïŒé»çäžã§ïŒã·ã§ãŒãã«ãããå±éããŸãã å®éãããã¯ç¬ç«ããŠã€ã³ã¹ããŒã«ã§ããéåžžã®ã¢ãžã¥ãŒã«ã§ããããšãã°ããã€ãã©ã€ã³çœ²åã¹ã¯ãªããã«è¿œå ã§ããŸãïŒ PSScriptAnalyzer

æ¡åŒµæ©èœã®èšå®ã§ã³ãŒãã®æžåŒèšå®ãã©ã¡ãŒã¿ãŒãèšå®ã§ããŸãããã¹ãŠã®èšå®ïŒãšãã£ã¿ãŒãšæ¡åŒµæ©èœã®äž¡æ¹ïŒã«å¯ŸããŠãæ€çŽ¢ããããŸãïŒ File - Preferences - Settings
ïŒ

æ°ããconptyã³ã³ãœãŒã«ãååŸããã«ã¯ãèšå®ã§ãã©ã°ãèšå®ããå¿
èŠããããŸã ãããããããã®ã¢ããã€ã¹ã¯é¢ä¿ãªãã§ãããã
VS Codeã®ãã¹ãŠã®ã¢ã¯ã·ã§ã³ã¯ãCtrl + Shift + Pã§åŒã³åºãããã³ã³ãããŒã«ã»ã³ã¿ãŒããå®è¡ã§ããããšãèŠããŠãã䟡å€ããããŸãã ãã£ããããæ¿å
¥ãããã³ãŒãããã©ãŒãããã ãè¡ãã¢ã«ãã¡ãããé ã«äžŠã¹æ¿ããã€ã³ãã³ããã¹ããŒã¹ããã¿ãã«å€æŽãããªã©ãããã¯ãã¹ãŠã³ã³ãããŒã«ã»ã³ã¿ãŒã«ãããŸãã
ããšãã°ãå
šç»é¢è¡šç€ºããªã³ã«ããŠãšãã£ã¿ãŒãäžå€®ã«é
眮ããŸãã

ãœãŒã¹ç®¡ç GitãSVN
å€ãã®å ŽåãWindowsã·ã¹ãã 管çè
ã¯ããŒãžã§ã³ç®¡çã·ã¹ãã ã®ç«¶åè§£æ±ºã«ææå¿ãæ±ããŠããŸããããã¯ããããããã®ã»ããã®ä»£è¡šè
ãgitã䜿çšããå Žåããã®çš®ã®åé¡ãçºçããªãããšãå€ãããã§ãã vscodeã䜿çšãããšãç«¶åã®è§£æ±ºã¯ãã³ãŒãã®æ®ãã®éšåãŸãã¯çœ®ãæããå¿
èŠã®ããéšåã§ã®æåéãã®ããŠã¹ã¯ãªãã¯ã«éå®ãããŸãã

303è¡ãš304è¡ã®éã®ãããã®ç¢æã¯ã¯ãªãã¯å¯èœã§ããç«¶åãçºçããå Žåã«ããã¥ã¡ã³ãã«è¡šç€ºããããã¹ãŠãã¯ãªãã¯ãã倿Žãã³ãããããŠãµãŒããŒã«å€æŽãéä¿¡ãã䟡å€ããããŸãã U-å©äŸ¿æ§ã
ããŒãžã§ã³ç®¡çã·ã¹ãã ã®æäœæ¹æ³ãšãvscode dockã§æžãããåçã䜿çšããæ¹æ³ã«ã€ããŠã¯ããããç°¡åã«ç¢ºèªããŠãã ããã
ã¹ãããã
ã¹ããããã¯ãã³ãŒãã®èšè¿°ãé«éåã§ããäžçš®ã®ãã¯ã/ãã³ãã¬ãŒãã§ãã ééããªãå¿
èŠã§ãã
ãªããžã§ã¯ãã®è¿
éãªäœæïŒ

ã³ã¡ã³ãããŒã¹ã®ãã«ãã®éïŒ

ã³ãã³ãã¬ããã倿°ã®ãã©ã¡ãŒã¿ãŒãæž¡ãå¿
èŠãããå Žåã¯ã splattingã䜿çšããã®ãçã«ããªã£ãŠããŸã ã
ããã圌ã®ã¹ããããã§ãã

Ctrl + Alt + Jã§äœ¿çšå¯èœãªãã¹ãŠã®ã¹ããããã衚瀺ããŸãã

ãã®åŸãåšå²ã®ç°å¢ãæ¹åãç¶ããããšæã£ãŠãããã wasp-lists nirazuã«ã€ããŠèããããšããªãå Žåã¯ãããã«ããŸã ã ãŸããPowerShellã¹ã¯ãªãããäœæãããšãã«äŸ¿å©ãªç¬èªã®æ¡åŒµæ©èœã»ãããããå Žåã¯ãã³ã¡ã³ãã«ãã®ãªã¹ãã衚瀺ãããŠããããã§ãã
æ§èœ
ããã©ãŒãã³ã¹ã®ãããã¯ã¯ãäžèŠãããšæããã»ã©åçŽã§ã¯ãããŸããã äžæ¹ã§ãææå°æ©ãªæé©åã«ãããã³ãŒãã®å¯èªæ§ãšä¿å®æ§ã倧å¹
ã«äœäžããã¹ã¯ãªããå®è¡æéã300ããªç§ç¯çŽãããŸããéåžžã®å®è¡æéã¯10åã§ããããã®å Žåã®äœ¿çšã¯ééããªãç Žå£çã§ãã äžæ¹ãã³ãŒãã®å¯èªæ§ãšæäœã®é床ã®äž¡æ¹ãåäžãããããã€ãã®éåžžã«åçŽãªããªãã¯ãããããããã¯ç¶ç¶çã«äœ¿çšããã®ã«éåžžã«é©åã§ãã 以äžã«ãããã®ããã€ãã«ã€ããŠèª¬æããŸãããããã©ãŒãã³ã¹ãããªãã«ãšã£ãŠãã¹ãŠã§ãããã¡ã³ããã³ã¹äžã®ãµãŒãã¹ã®ããŠã³ã¿ã€ã ã®å³ããæéå¶éã®ããã«èªã¿ããããéäžã§ããå Žåã¯ã å°éã®æç®ãåç
§ããããšããå§ãããŸãã
ãã€ãã©ã€ã³ãšforeach
çç£æ§ãé«ããæãç°¡åã§åžžã«æ©èœããæ¹æ³ã¯ããã€ãã®äœ¿çšãé¿ããããšã§ãã åã®å®å
šæ§ãšPowerShellã®ããã®äœæ¥ã®å©äŸ¿æ§ã«ãããèŠçŽ ããã€ãã«æž¡ããšãåèŠçŽ ããªããžã§ã¯ãã«ã©ãããããŸãã ããããããèšèªã§ã¯ããã®åäœã¯ãã¯ã·ã³ã°ãšåŒã°ããŸãã ãã¯ã·ã³ã°ã¯è¯ãã§ããããã¯ã»ãã¥ãªãã£ãä¿èšŒããŸãããããã¯ããèªèº«ã®äŸ¡æ Œãæã£ãŠããŸããããã¯æã
æ¯æãæå³ããããŸããã
æåã®ã¹ãããã¯ã Foreach-Object
ãã¹ãŠã®ã¢ããªã±ãŒã·ã§ã³ãåé€ããforeachã¹ããŒãã¡ã³ãã«çœ®ãæããããšã«ãããçç£æ§ãåäžãããèªã¿ããããåäžãããããšã§ãã foreach
ã¯Foreach-Object
ãšã€ãªã¢ã¹ã§ããããããããã¯å®éã«ã¯2ã€ã®ç°ãªããšã³ãã£ãã£ã§ãããšããäºå®ã«æ··ä¹±ããå¯èœæ§ããããŸã-å®éã«ã¯ãäž»ãªéãã¯foreach
ã¯ãã€ãã©ã€ã³ããå€ãåãå
¥ãããåæã«æå€§3åã®é床ã§åäœããããšã§ãã
åé¡ãæ³åããŠãã ãããããšãã°ã倧ããªãã°ãåŠçããŠãã®æŽŸçç©ãäœæããå¿
èŠããããŸããããšãã°ããã®äžã®äžé£ã®ãšã³ããªãéžæããŠå¥ã®åœ¢åŒã«ããå¿
èŠããããŸãã
Get-Content D:\temp\SomeHeavy.log | Select-String '328117'
äžèšã®äŸã§ã¯ãã¿ã¹ã¯ã®æåã®æ®µé-å¿
èŠãªã¬ã³ãŒãã®éžæãæãããããããæ¹æ³ã§åæ ŒããŸãããããã¯èªç¥ã®å®¹æããšè¡šçŸåã«åªããŠããŸããåæã«ãçç£æ§ã倧å¹
ã«äœäžãããå Žæãã€ãŸããã€ãã©ã€ã³ãå«ãŸããŠããŸãããŸãã¯ããã€ãã©ã€ã³èªäœãåå ã§ã¯ãªããã³ãã³ãã¬ããã®åäœã§ãããšèšãããŸãGet-Content
ããã€ãã©ã€ã³ã§ããŒã¿ã転éããã«ã¯ããã¡ã€ã«ã1è¡ãã€èªã¿åãããã°ã®åè¡ãããŒã¹ã¿ã€ãããstring
ãªããžã§ã¯ãã«ã©ãããããµã€ãºã倧å¹
ã«å¢ããããã£ãã·ã¥å
ã®ããŒã¿ã®å±ææ§ãæžãããæ¬åœã«å¿
èŠãªäœæ¥ãè¡ããŸããããããåé¿ããã«ã¯ç°¡åã§ãããã®ããŒã¿ãäžåºŠã«å®å
šã«èªã¿åãå¿
èŠãããããšããã©ã¡ãŒã¿ãŒã§ç€ºãå¿
èŠããããŸãã
When reading from and writing to binary files, use the AsByteStream parameter and a value of 0 for the ReadCount parameter. A ReadCount value of 0 reads the entire file in a single read operation. The default ReadCount value, 1, reads one byte in each read operation and converts each byte into a separate object, which causes errors when you use the Set-Content cmdlet to write the bytes to a file unless you use AsByteStream
https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/get-content
Get-Content D:\temp\SomeHeavy.log -ReadCount 0 | Select-String '328117'
:

, . Select-String
â . , Select-String
. , Select-String
, , :
foreach ( $line in ( Get-Content D:\temp\SomeHeavy.log -ReadCount 0 )) { if ( $line -match '328117' ) { $line } }
30 , - 30%, , , , - , ( ;-). , . , -match
; â . , â â - , .
â - , " " :
foreach ( $line in ( Get-Content D:\temp\SomeHeavy.log -ReadCount 0 )) { if ( $line -match '328117' ) { "$( Get-Date -UFormat '%d.%m.%Y %H:%M:%S') $line" | Out-File D:\temp\Result.log -Append } }
Measure-Command
:
Hours : 2 Minutes : 20 Seconds : 9 Milliseconds : 101
. , , , . , PowerShell , , â . , , â StringBuilder . , , . , .
$StringBuilder = New-Object System.Text.StringBuilder foreach ( $line in ( Get-Content D:\temp\SomeHeavy.log -ReadCount 0 )) { if ( $line -match '328117' ) { $null = $StringBuilder.AppendLine( "$( Get-Date -UFormat '%d.%m.%Y %H:%M:%S') $line" ) } } Out-File -InputObject $StringBuilder.ToString() -FilePath D:\temp\Result.log -Append -Encoding UTF8
5 , :
Hours : 0 Minutes : 5 Seconds : 37 Milliseconds : 150
Out-File -InputObject
, , . â . â Get-Help
-Full
, Accept pipeline input? true (ByValue)
:
-InputObject <psobject> Required? false Position? Named Accept pipeline input? true (ByValue) Parameter set name (All) Aliases None Dynamic? false
PowerShell :

StringBuilder
:

, , 3 3. dotnet- â StreamReader .
$StringBuilder = New-Object System.Text.StringBuilder $StreamReader = New-Object System.IO.StreamReader 'D:\temp\SomeHeavy.log' while ( $line = $StreamReader.ReadLine()) { if ( $line -match '328117' ) { $null = $StringBuilder.AppendLine( "$( Get-Date -UFormat '%d.%m.%Y %H:%M:%S') $line" ) } } $StreamReader.Dispose() Out-File -InputObject $StringBuilder.ToString() -FilePath C:\temp\Result.log -Append -Encoding UTF8
Hours : 0 Minutes : 5 Seconds : 33 Milliseconds : 657
, . , , , , 2. , :

â "", â StringBuilder
â "" . , ( 100) . â 90% ( , ):
$BufferSize = 104857600 $StringBuilder = New-Object System.Text.StringBuilder $BufferSize $StreamReader = New-Object System.IO.StreamReader 'C:\temp\SomeHeavy.log' while ( $line = $StreamReader.ReadLine()) { if ( $line -match '1443' ) { # if ( $StringBuilder.Length -gt ( $BufferSize - ( $BufferSize * 0.1 ))) { Out-File -InputObject $StringBuilder.ToString() -FilePath C:\temp\Result.log -Append -Encoding UTF8 $StringBuilder.Clear() } $null = $StringBuilder.AppendLine( "$( Get-Date -UFormat '%d.%m.%Y %H:%M:%S') $line" ) } } Out-File -InputObject $StringBuilder.ToString() -FilePath C:\temp\Result.log -Append -Encoding UTF8 $StreamReader.Dispose()
Hours : 0 Minutes : 5 Seconds : 53 Milliseconds : 417
1 :

, . , , StreamWriter , , ;-) , , .
- â , . , â . Select-String
Out-File
, OutOfMemoryException
, â .
, PowerShell , â , : PowerShell â , .
, StringBuilder
dir
â ( ). :
$CurrentPath = ( Get-Location ).Path + '\' $StringBuilder = New-Object System.Text.StringBuilder foreach ( $Line in ( &cmd /c dir /b /s /ad )) { $null = $StringBuilder.AppendLine( $Line.Replace( $CurrentPath, '.' )) } $StringBuilder.ToString()
Hours : 0 Minutes : 0 Seconds : 3 Milliseconds : 9
$StringBuilder = New-Object System.Text.StringBuilder foreach ( $Line in ( Get-ChildItem -File -Recurse | Resolve-Path -Relative )) { $null = $StringBuilder.AppendLine( $Line ) } $StringBuilder.ToString()
Hours : 0 Minutes : 0 Seconds : 16 Milliseconds : 337
$null â . , â Out-Null
; , ( $null
) , .
# : $null = $StringBuilder.AppendLine( $Line ) # : $StringBuilder.AppendLine( $Line ) | Out-Null
, , . Compare-Object
, , , . robocopy.exe, ( PowerShell 5), :
class Robocopy { [String]$RobocopyPath Robocopy () { $this.RobocopyPath = Join-Path $env:SystemRoot 'System32\Robocopy.exe' if ( -not ( Test-Path $this.RobocopyPath -PathType Leaf )) { throw ' ' } } [void]CopyFile ( [String]$SourceFile, [String]$DestinationFolder ) { $this.CopyFile( $SourceFile, $DestinationFolder, $false ) } [void]CopyFile ( [String]$SourceFile, [String]$DestinationFolder, [bool]$Archive ) { $FileName = [IO.Path]::GetFileName( $SourceFile ) $FolderName = [IO.Path]::GetDirectoryName( $SourceFile ) $Arguments = @( '/R:0', '/NP', '/NC', '/NS', '/NJH', '/NJS', '/NDL' ) if ( $Archive ) { $Arguments += $( '/A+:a' ) } $ErrorFlag = $false &$this.RobocopyPath $FolderName $DestinationFolder $FileName $Arguments | Foreach-Object { if ( $ErrorFlag ) { $ErrorFlag = $false throw "$_ $ErrorString" } else { if ( $_ -match '(?<=\(0x[\da-f]{8}\))(?<text>(.+$))' ) { $ErrorFlag = $true $ErrorString = $matches.text } else { $Logger.AddRecord( $_.Trim()) } } } if ( $LASTEXITCODE -eq 8 ) { throw 'Some files or directories could not be copied' } if ( $LASTEXITCODE -eq 16 ) { throw 'Robocopy did not copy any files. Check the command line parameters and verify that Robocopy has enough rights to write to the destination folder.' } } [void]SyncFolders ( [String]$SourceFolder, [String]$DestinationFolder ) { $this.SyncFolders( $SourceFolder, $DestinationFolder, '*.*', '', $false ) } [void]SyncFolders ( [String]$SourceFolder, [String]$DestinationFolder, [Bool]$Archive ) { $this.SyncFolders( $SourceFolder, $DestinationFolder, '*.*', '', $Archive ) } [void]SyncFolders ( [String]$SourceFolder, [String]$DestinationFolder, [String]$Include ) { $this.SyncFolders( $SourceFolder, $DestinationFolder, $Include, '', $false ) } [void]SyncFolders ( [String]$SourceFolder, [String]$DestinationFolder, [String]$Include, [Bool]$Archive ) { $this.SyncFolders( $SourceFolder, $DestinationFolder, $Include, '', $Archive ) } [void]SyncFolders ( [String]$SourceFolder, [String]$DestinationFolder, [String]$Include, [String]$Exclude ) { $this.SyncFolders( $SourceFolder, $DestinationFolder, $Include, $Exclude, $false ) } [void]SyncFolders ( [String]$SourceFolder, [String]$DestinationFolder, [String]$Include, [String]$Exclude, [Bool]$Archive ) { $Arguments = @( '/MIR', '/R:0', '/NP', '/NC', '/NS', '/NJH', '/NJS', '/NDL' ) if ( $Exclude ) { $Arguments += $( '/XF' ) $Arguments += $Exclude.Split(' ') } if ( $Archive ) { $Arguments += $( '/A+:a' ) } $ErrorFlag = $false &$this.RobocopyPath $SourceFolder $DestinationFolder $Include $Arguments | Foreach-Object { if ( $ErrorFlag ) { $ErrorFlag = $false throw "$_ $ErrorString" } else { if ( $_ -match '(?<=\(0x[\da-f]{8}\))(?<text>(.+$))' ) { $ErrorFlag = $true $ErrorString = $matches.text } else { $Logger.AddRecord( $_.Trim()) } } } if ( $LASTEXITCODE -eq 8 ) { throw 'Some files or directories could not be copied' } if ( $LASTEXITCODE -eq 16 ) { throw 'Robocopy did not copy any files. Check the command line parameters and verify that Robocopy has enough rights to write to the destination folder.' } } }
, ( ), â .
, : Foreach-Object
!? , : foreach
, Foreach-Object
â , , , , . .
, :
$Robocopy = New-Object Robocopy # $Robocopy.CopyFile( $Source, $Dest ) # $Robocopy.SyncFolders( $SourceDir, $DestDir ) # .xml $Robocopy.SyncFolders( $SourceDir, $DestDir , '*.xml', $true ) # *.zip *.tmp *.log $Robocopy.SyncFolders( $SourceDir, $DestDir, '*.*', '*.zip *.tmp *.log', $true )
â , , ; , , , :
foreach
Foreach-Object
;
;
/ , ;
StringBuilder
;
, - ;
( "" );
: - , .
Jobs
, , , , , , . . , IO, .
ssdããã¯ãæ°ããã€ã³ã¹ããŒã«ãããHyper-Vã®Windows Server 2019ããssdãžã®æåã®ããŒããè¡ãããæ¹æ³ã§ãïŒä»®æ³ãã·ã³ã®hddãžã®ç§»è¡ã«ãã£ãŠæ±ºå®ãããŸããïŒã

PowerShell ( Get-Command *-Job
), .
, , , :
$Job = Start-Job -ScriptBlock { Write-Output 'Good night' Start-Sleep -S 10 Write-Output 'Good morning' } $Job | Wait-Job | Receive-Job Remove-Job $Job
, â , . .
, :

https://xaegr.wordpress.com/2011/07/12/threadping/
, , â , . , , (50 â 50 ):

. , â , . â , .
, , , - .
Runspaces
â Beginning Use of PowerShell Runspaces: Part 1 . , â PowerShell , . (, PowerShell ), : ( ) . , .
WPF , PowerShell, . â , . â , "" . .
, .

# $GUISyncHash = [hashtable]::Synchronized(@{}) <# WPF #> $GUISyncHash.FormXAML = [xml](@" <Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Sample WPF Form" Height="510" Width="410" ResizeMode="NoResize"> <Grid> <Label Content=" " HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top" Height="37" Width="374" FontSize="18"/> <Label Content="" HorizontalAlignment="Left" Margin="16,64,0,0" VerticalAlignment="Top" Height="26" Width="48"/> <TextBox x:Name="BackupPath" HorizontalAlignment="Left" Height="23" Margin="69,68,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Width="300"/> <Label Content="" HorizontalAlignment="Left" Margin="16,103,0,0" VerticalAlignment="Top" Height="26" Width="35"/> <TextBox x:Name="RestorePath" HorizontalAlignment="Left" Height="23" Margin="69,107,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Width="300"/> <Button x:Name="FirstButton" Content="â" HorizontalAlignment="Left" Margin="357,68,0,0" VerticalAlignment="Top" Width="23" Height="23"/> <Button x:Name="SecondButton" Content="â" HorizontalAlignment="Left" Margin="357,107,0,0" VerticalAlignment="Top" Width="23" Height="23"/> <CheckBox x:Name="Check" Content=" " HorizontalAlignment="Left" Margin="16,146,0,0" VerticalAlignment="Top" RenderTransformOrigin="-0.113,-0.267" Width="172"/> <Button x:Name="Go" Content="Go" HorizontalAlignment="Left" Margin="298,173,0,0" VerticalAlignment="Top" Width="82" Height="26"/> <ComboBox x:Name="Droplist" HorizontalAlignment="Left" Margin="16,173,0,0" VerticalAlignment="Top" Width="172" Height="26"/> <ListBox x:Name="ListBox" HorizontalAlignment="Left" Height="250" Margin="16,210,0,0" VerticalAlignment="Top" Width="364"/> </Grid> </Window> "@) <# #> $GUISyncHash.GUIThread = { $GUISyncHash.Window = [Windows.Markup.XamlReader]::Load(( New-Object System.Xml.XmlNodeReader $GUISyncHash.FormXAML )) $GUISyncHash.Check = $GUISyncHash.Window.FindName( "Check" ) $GUISyncHash.GO = $GUISyncHash.Window.FindName( "Go" ) $GUISyncHash.ListBox = $GUISyncHash.Window.FindName( "ListBox" ) $GUISyncHash.BackupPath = $GUISyncHash.Window.FindName( "BackupPath" ) $GUISyncHash.RestorePath = $GUISyncHash.Window.FindName( "RestorePath" ) $GUISyncHash.FirstButton = $GUISyncHash.Window.FindName( "FirstButton" ) $GUISyncHash.SecondButton = $GUISyncHash.Window.FindName( "SecondButton" ) $GUISyncHash.Droplist = $GUISyncHash.Window.FindName( "Droplist" ) $GUISyncHash.Window.Add_SourceInitialized({ $GUISyncHash.GO.IsEnabled = $true }) $GUISyncHash.FirstButton.Add_Click( { $GUISyncHash.ListBox.Items.Add( 'Click FirstButton' ) }) $GUISyncHash.SecondButton.Add_Click( { $GUISyncHash.ListBox.Items.Add( 'Click SecondButton' ) }) $GUISyncHash.GO.Add_Click( { $GUISyncHash.ListBox.Items.Add( 'Click GO' ) }) $GUISyncHash.Window.Add_Closed( { Stop-Process -Id $PID -Force }) $null = $GUISyncHash.Window.ShowDialog() } $Runspace = @{} $Runspace.Runspace = [RunspaceFactory]::CreateRunspace() $Runspace.Runspace.ApartmentState = "STA" $Runspace.Runspace.ThreadOptions = "ReuseThread" $Runspace.Runspace.Open() $Runspace.psCmd = { Add-Type -AssemblyName PresentationCore, PresentationFramework, WindowsBase }.GetPowerShell() $Runspace.Runspace.SessionStateProxy.SetVariable( 'GUISyncHash', $GUISyncHash ) $Runspace.psCmd.Runspace = $Runspace.Runspace $Runspace.Handle = $Runspace.psCmd.AddScript( $GUISyncHash.GUIThread ).BeginInvoke() Start-Sleep -S 1 $GUISyncHash.ListBox.Dispatcher.Invoke( "Normal", [action] { $GUISyncHash.ListBox.Items.Add( '' ) }) $GUISyncHash.ListBox.Dispatcher.Invoke( "Normal", [action] { $GUISyncHash.ListBox.Items.Add( ' ' ) }) foreach ( $item in 1..5 ) { $GUISyncHash.Droplist.Dispatcher.Invoke( "Normal", [action] { $GUISyncHash.Droplist.Items.Add( $item ) $GUISyncHash.Droplist.SelectedIndex = 0 }) } $GUISyncHash.ListBox.Dispatcher.Invoke( "Normal", [action] { $GUISyncHash.ListBox.Items.Add( 'While ( $true ) { Start-Sleep -S 10 }' ) }) while ( $true ) { Start-Sleep -S 10 }
WPF github, , smart : https://github.com/snd3r/GetDiskSmart/ . , MVVM:

Visual Studio, Community Edition , xaml- wpf â https://github.com/punker76/kaxaml

çµè«ã®ä»£ããã«
PowerShell â Windows-. , , , .
, , "PowerShell, ", . , â , . . , - , - .
â .

PS Boomburumã¯ã2019幎ã®PowerShellæ§æã®åŒ·èª¿è¡šç€ºããµããŒãããŠããŸãã-ããã·ã¥æååã