私はこれについて不満を抱くのが間違っている場合、私を許してください。しかし、これがPowerShellのようなスクリプト言語で何かをリモートで複雑にしようとするのが嫌な理由です。予測不可能な戦いは決して終わらない。これはPowerShellのTrimStartのバグですか?
だから、ここにある:
PS C:\WINDOWS\system32> $PSVersionTable.PSVersion
Major Minor Build Revision
----- ----- ----- --------
5 1 15063 632
PS C:\WINDOWS\system32> $testpath = "\\a-server-unc\home\auser\Outlook Data\archive1 - Copy.pst"
PS C:\WINDOWS\system32> $(Split-path -path $testpath -Parent)
\\a-server-unc\home\auser\Outlook Data #Ok - Looks good
PS C:\WINDOWS\system32> $(Split-path -path $testpath -Parent).TrimStart("\\a-server-unc")
home\auser\Outlook Data # Where did my slash go?
PS C:\WINDOWS\system32> $(Split-path -path $testpath -parent).TrimStart("\\a-server-unc\home")
Outlook Data # Wait - What the...
PS C:\WINDOWS\system32> $testpath
\\a-server-unc\home\auser\Outlook Data\archive1 - Copy.pst # Yep - I'm not insane. Powershell is eating my characters.
PS C:\WINDOWS\system32> $testpath = "\\a-server-unc\home\aloser\Outlook Data\archive1 - Copy.pst" #Let's try changing the string a little
PS C:\WINDOWS\system32> $(Split-path -path $testpath -Parent).TrimStart("\\a-server-unc\home")
loser\Outlook Data # I must be insane
PS C:\WINDOWS\system32> $(Split-path -path $testpath -Parent).TrimStart("`\`\a-server-unc`\home") #Certainly escaping the slashes will fix this?
loser\Outlook Data # Nope, more hours wasted on unpredictable behavior
今明らかに存在ここではいくつかの奇妙な、「完全に正常な」動作ですが、私はPowerShellが私の文字列を食べて少し疲れています。
ここで魔法の薬は何ですか? (あなたが期待しているように見えるよう)TrimStart()
を入力し、いない文字列として文字列を取ることに注意し、特にhttps://msdn.microsoft.com/en-us/library/system.string.trimstart.aspx
:
「私はPowerShellのようなスクリプト言語でのリモートでの複雑な何かをしようとしている嫌い、なぜ*がしかし、これは、それは予測不可能で終わることのない戦いです*。。」 - ネットでString.TrimStart()がありましたPowerShellが存在する前の少なくとも3年(15年以上)。これはC#とVB.Net、Python、PHPでも同じです。 JavaScript、Java、Swift、Ruby、C++のstd :: stringには存在しません(いずれの形式でも)。私が今までに見つけた唯一の言語は、両方のバージョンの選択肢があるGoです。どの言語があなたから来ていますか?あなたはそれが異なると予測し、それを「予測不可能」と表現するように導きますか? – TessellatingHeckler
とにかく、 '.Trim()'は文字列の両端からスペースを削除します。スペース、タブ、改行です。特定の文字を削除するように拡張することもできます。任意の種類の引用符文字、または文字列の両側から任意の種類の括弧/括弧を削除します。そのコンテキストでは、文字配列が意味を成し、.TrimStartと.TrimEndを制限する方が意味があります。もう一方の方法を一般化すると、一方の端から固定された文字列を取り除くことができる関数が、両端から固定された文字列を取り除くことができる関数になるようにするのは意味がありません。 – TessellatingHeckler
'-replace"^\\\\ a-server-unc "'とすると、特殊文字がエスケープするか、 '[regex] :: Escape()' 'が必要な正規表現パターンにマッチするという警告が表示されます。デフォルトでは大文字と小文字を区別しません( '.Replace()'は大文字と小文字を区別します)。 – TessellatingHeckler