2016-10-17 2 views
-1

powershell에 명령의 N 자 제한이 있다고 가정 할 때 powershell cmdlet에 N 개 이상의 문자를 전달하려면 어떻게해야합니까? https://support.microsoft.com/en-in/kb/830473 링크를 기준으로하면 글자 수 제한은 8191이지만 cmd.exe의 경우 powershell에 대한 크기 제한이 무엇인지 모릅니다. 따라서 8KB가 넘는 크기의 입력이있는 경우이 문제를 피하기 위해 입력을 powershell로 리디렉션 할 수 있습니까 (참조 된 문서에 언급 된 내용에 기반한 솔루션).powershell에 큰 입력을 전달하는 방법

예 :

PowerShell 콘솔의 $> 에코 "매우 긴 문자열"// 에코와 PowerShell 콘솔 미만 8192 문자에 달하는 매우 긴 문자열을 포함하여 전체 명령. 이걸 실행할 때 전체 문자열을 콘솔의 출력으로 얻습니다.

powershell console $> echo "매우 긴 문자열 // 매우 긴 문자열에 문자를 추가하려고하면 powershell이 ​​더 이상 추가 할 수 없습니다. 입력 할 수있는 문자 수의 한계에 도달했기 때문에 합계가 8192를 넘으면 매우 긴 문자열로 문자가 바뀝니다.

내가 원하는 것은 :

PowerShell 콘솔의 $> 에코 // 파일에서 (이상 8192 개 문자입니다) 내 입력을 놓고 반향 입력으로 그 제공을하고에 전체 문자열을 표시한다 에코 콘솔에서 명령의 문자 수 제한을 회피합니다.

내가 사용한 명령 에코는 표현 목적으로 만 사용되며이 대신 올바른 사용자 지정 cmdlet을 사용하려고합니다.

편집 2 :

psm1 파일 :

Function DoSomething { 

    [CmdletBinding()] 
    Param(
    [Parameter(
    Mandatory = $False) 
    ] 
    [string]$v1, 

    [Parameter(
    Mandatory = $False) 
    ] 
    [string]$v2) 

    Begin {} 

    Process { 
    Write-Output "hello $v1 | $v2" 
    } 
} 

텍스트 파일의 내용은 (표현 목적으로 짧지 만,이 이상 8K 자까지 가능합니다 가정) content.txt 말 :

-v1 "t1" -v2 "qwe" 

지금 내가 할 때

powershell Console$> DoSomething (Get-Content content.txt) 
내가 할 10

출력은

hello -v1 "t1" -v2 "qwe" | 

내가 cmdlet의 실행이 문제없이 일어날 수 있도록 출력이

hello -v1 "t1" | -v2 "qwe" 

이 될 것으로 기대한다. 텍스트 파일에서 8k 이상의 문자를 사용하여이 작업을 시도했지만 출력을 인쇄 할 수 있습니다. 매개 변수가 분리되지 않는 것입니다. cmdlet에 입력을 제공하는 명령은 Get-Content 일 필요는 없으며 작동하는 한 아무 것도 될 수 있습니다.

+2

당신은 PowerShell에 입력 제한이 있다고 가정하고 있지만이 제한은 CMD.EXE를 기준으로합니까? 그것은 당신이 PowerShell에서 CMD.EXE로 전달할 입력을 기대할 것이기 때문입니까? 실행할 cmdlet을 명확히 할 수 있습니까? 우리에게 특정 [mcve]를 제공 하시겠습니까? – gravity

+0

@gravity 답장을 보내 주셔서 감사합니다. 아니요, 입력이 CMD.exe로 전달되지 않거나 반대의 경우도 마찬가지입니다. 나는 많은 실을 읽고 나는 8k를 언급 한 것을 보았다. 대체 설명에 대해 이야기 한 이래로이 링크를 줬습니다. 실행하려고하는 cmdlet에 대한 질문에 복사 및 확장을 통해 생성 된 임의의 문자열 인 echo "<임의의 문자열>"을 시도 했으므로 일부는 약 8175 정도의 한계에 도달했습니다. 890을 초과 할 수도 있습니다. 따라서이를 고려해야합니다. 이 cmdlet은 사용자 지정 cmdlet 용입니다. – randomuser15995183

+0

나는 여전히 [mcve]를 보여줄 것을 권하고 싶습니다. 한계에 관한 한 당신이 뭘하고 있는지 명확하게 밝히지는 않습니다. 나는 추측을하지만 질문이 명백하게 분명하지 않으면 대답하지 않을 것입니다. 예를 들어 PowerShell cmdlet에서 왜'echo'를 사용하는지 확신 할 수 없습니다. – gravity

답변

0

그렇지 않으면이 파일의 내용이 스크립트 ps에서 사용되는 경로 파일을 전달할 수 있습니다. 제한 없음 ...

+0

답장을 보내 주셔서 감사합니다. 나는 당신이 경로 파일의 의미를 정확히 모르겠습니다. 정교하게 주시겠습니까? – randomuser15995183

2

PowerShell 함수의 매개 변수가 어떻게 작동하는지 오해합니다. Get-Content의 출력은 문자열 배열 (파일의 각 행에 대해 하나의 문자열)이지만 전체 배열은 첫 번째 매개 변수로 전달됩니다. 또한 문자열은 마술처럼 분할되지 않으므로 하위 문자열이 여러 매개 변수로 이동할 수 있습니다. PowerShell은 문자열을 분할하는 방법을 어떻게 알아야합니까?(매개 변수 이름을 일치하는 열 이름)

Function DoSomething { 
    [CmdletBinding()] 
    Param(
    [Parameter(
     Mandatory=$false, 
     ValueFromPipeline=$true, 
     ValueFromPipelineByPropertyName=$true 
    )] 
    [string]$v1, 

    [Parameter(
     Mandatory=$false, 
     ValueFromPipeline=$true, 
     ValueFromPipelineByPropertyName=$true 
    )] 
    [string]$v2 
) 

    Process { 
    Write-Output "hello $v1 | $v2" 
    } 
} 

과 CSV로 데이터를 정의 :

등의 입력 데이터를 처리하는 더 좋은 방법은 함수가 파이프 라인에서 입력을 허용하는 것입니다

v1,v2 
"-v1 ""t1""","-v2 ""qwe"""

당신이 파이프 기능으로 데이터를 할 수 있도록 : 함수와

Import-Csv content.csv | DoSomething 

내장 이런 식으로 당신은 또한 해시 테이블과 splat을 같이 데이터를 정의 할 수 있습니다 :

$data = @{ 
    'v1' = '-v1 "t1"' 
    'v2' = '-v2 ""qwe"' 
} 

DoSomething @data 

를 자세한 내용은 함수의 매개 변수가 about_Parametersabout_Functions_Advanced_Parameters를 참조에 대해.

+0

아, 이해와 설명에 감사드립니다. 그래서 제 시나리오에는 ValuefromPipeline 속성이 설정되지 않은 DoSomething과 같은 많은 cmdlet이 있습니다.또한 지금까지 "DoSomething "와 같은 cmdlet에 직접 전달하여 입력을 처리했지만 최근에는 입력이 8k보다 커질 수 있으므로 다른 방법을 사용해야합니다. 기존 cmdlet 작성 방법을 입력에 반영하는 방식을 수정해야합니다. 그래서 뭔가 "DoSomething randomuser15995183

+0

... 그것이 효과가 있다면 나를 위해 완벽했습니다. 가능한 것은 아닐지 모르지만 cmdlet 및 입력을 변경하면 내 시나리오에 적합하지 않을 수 있기 때문에 수행 할 수있는 방법이 있는지 알고 싶을뿐입니다. – randomuser15995183

관련 문제