2017-10-03 1 views
0

내가 이것에 대해 좌절하는 것이 잘못되면 나를 용서해주십시오. 그러나 이것이 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 

지금 분명히 여기에 몇 가지 이상한, "완벽하게 정상적인"행동이,하지만 난 내 문자열을 먹는 파워 쉘의 조금 피곤 해요 :

그래서, 여기 있습니다.

여기에있는 마법의 묘약은 무엇입니까? (당신이 기대하는 것 같은) TrimStart()가 입력되지 문자열로 문자 배열을 참고, 특히 https://msdn.microsoft.com/en-us/library/system.string.trimstart.aspx

:

+0

"나는 PowerShell을 같은 스크립트 언어에서 원격으로 복잡한 무엇을하려고 싫어하는 이유 *는하지만,이는 그것은 예측 불가능과 끝없는 전투입니다. *."- 닷넷에서 String.TrimStart()이 있었다 PowerShell이 ​​출시되기 최소 3 년 (15 년 이상). C#과 VB.Net, Python, PHP에서도 마찬가지입니다. 자바 스크립트, 자바, 스위프트, 루비, C++의 std :: string; 지금까지 내가 찾은 유일한 언어는 두 가지 버전 중 하나를 선택하는 것이다. 그 언어에서 오는 언어는 무엇이 다른가를 예측하고 '예측할 수없는'것이라고 설명하도록 이끌고 있습니까? – TessellatingHeckler

+0

어쨌든'.Trim()'은 공백, 탭, 개행 문자 인 문자열의 양쪽 끝에서 공백을 제거합니다. 또는 특정 문자를 제거하도록 확장 될 수 있습니다 (예 : 어떤 종류의 따옴표 문자 나 문자열의 양쪽에서 괄호/괄호를 제거하십시오. 이러한 맥락에서 문자 배열은 의미가 있으며 .TrimStart와 .TrimEnd를 제한하는 것이 더 합리적입니다. 다른 방법을 일반화하고 한쪽 끝에서 고정 된 문자열을 제거 할 수있는 함수를 사용하면 양쪽 끝에서 고정 된 문자열을 제거 할 수있는 함수가됩니다. 그만큼 유용하지 않기 때문입니다. – TessellatingHeckler

+0

'-replace "^ \\\ a-server-unc"'는 정규식 패턴이 일치하여 특수 문자가 이스케이프 처리되거나'[regex] :: Escape()' '가 필요하다는 경고와 함께 처리합니다. 그것은 대소 문자를 구별합니다 ('.Replace()'는 대소 문자를 구별합니다). – TessellatingHeckler

답변

2

예상되는 동작입니다 . 문서 당으로

String.TrimStart 방법 (CHAR())

현재 String 개체에서 배열에 지정된 문자 집합의 모든 주요 항목을 삭제합니다.- source

가 연속 된 문자열을 트리밍하려면 출력은

홈 \ 사용자 초래 정규식

"\a-server-unc\home\user\a-server-unc\Outlook Data\archive1" -replace "^\\a-server-unc\\",'' 

를 사용하여 -replace 사용할 수 있습니다 \ A-서버 UNC \ Outlook 데이터 \ archive1

키 문자에는 해당 문자가 시작된 직후임을 나타 내기 위해 ^이 포함되어 있습니다. 라인이 아니라 어디에서나 (즉 이유의 두 번째 선두로부터 내 대체 머물렀다.) 당신이 정규식을 피하기 위해 선호하는 경우,이 같은 필요

: 두 가지의 차이는

function TrimStart([String]$InputObject,[String]$Value){ 
    if ($InputObject.StartsWith($Value)) { 
     return $InputObject.Substring($value.Length,$InputObject.Length - $value.Length) 
    } 
    else{ 
     return $InputObject 
    } 
} 

여기입니다 동작. $ ConceptString = '이 문장은 완전한 문장이기도 한 매우 긴 문자열입니다 !!!'

write-host $ConceptString.TrimStart('This is a very long string') -ForegroundColor Cyan 
#Output: ppens to be a complete sentence !!! 
Write-host $(TrimStart $ConceptString -Value 'This is a very long string') -ForegroundColor Green 
#output: that also happens to be a complete sentence !!! 
+0

PowerShell에서이 작업을 수행 할 수있는 기능이 내장되기를 기대하고있었습니다. '.Replace ($ startstring, "")로 끝나는 것은 문자의 순서가 문자열의 시작 부분에서만 존재할 것이라고 확신하기 때문입니다. 하지만 솔루션이 더 정확하고 올바르게 작동합니다. 감사. – Appleoddity

+0

상단의 편집을 참조하십시오. 실제로, 지원 regex를 대체 할 수 있도록 powershell 내장 된 한 줄 짜기는 줄의 시작 부분 만 바꾸면됩니다. –

1

여기 TrimStart() 설명서를 참조하십시오

public string TrimStart(
    params char[] trimChars 
) 

을 그래서 TrimStart() 제거한다 문자가 아닌 전체 문자열.

볼, 예를 들면, 출력 :

$testpath = "hhhhhhhhhhhhhhelloooooooo".TrimStart("h") 

이 출력 :

elloooooooo

용액 대신 Replace() 함수를 사용하는 것이다. 이 작업을 수행하는

하나는 이러한 방법 : $newPath에 대한

$testpath = "\\a-server-unc\home\auser\Outlook Data\archive1 - Copy.pst" 
$basepath = "\\a-server-unc\" 
[regex]$pattern = [regex]::escape($basepath) 
# pattern is regex version of string you want to replace 
# .replace("string to replace", "replacing string", numberOfReplacements) 
# i.e. only replace the 1st instance 
$newPath = $pattern.replace($testpath, [string]::Empty, 1) 

출력 :

집 \ AUSER \ Outlook 데이터 \의 아카이브 1 - Copy.pst

+0

고마워요. 나는 그걸 보았고 그것에 대해 읽고 있습니다. 다른 문자열의 시작 부분에서 문자열을 확실하게 제거하는 적절한 방법이 있습니까? – Appleoddity

+1

부록으로'.Replace()'를 사용하여 예상되는 결과를 얻고 빈 문자열로 대체합니다. 예를 들면 다음과 같습니다.'.Replace ('\\ a-server-unc', [string] :: Empty)' – Persistent13

+0

이것은 괜찮은 해결책이며, 나는 그걸로갔습니다. 그러나 시작 이외의 다른 위치에서 주 문자열 내에서 발생하는 하위 문자열은 고려하지 않습니다. 이것은 예기치 않은 결과를 초래할 수 있습니다. 그래도 고마워. – Appleoddity