2014-04-14 5 views
12

मैं पावरशेल स्क्रिप्ट में GetInvalidFileNameChars() विधि का उपयोग करने का तरीका ढूंढने में सक्षम था। हालांकि, ऐसा लगता है कि व्हाइटस्पेस को फ़िल्टर करें (जो मैं नहीं चाहता)।फ़ाइल नामों को सहेजने से पहले अवैध पात्रों को कैसे पट्टी करें?

संपादित करें: शायद मैं इसे स्पष्ट रूप से पर्याप्त नहीं पूछ रहा हूं। मैं नीचे दिए गए फ़ंक्शन को उन रिक्त स्थानों को शामिल करना चाहता हूं जो पहले से ही फ़ाइल नामों में मौजूद हैं। वर्तमान में, स्क्रिप्ट रिक्त स्थान फ़िल्टर करता है।

Function Remove-InvalidFileNameChars { 

param([Parameter(Mandatory=$true, 
    Position=0, 
    ValueFromPipeline=$true, 
    ValueFromPipelineByPropertyName=$true)] 
    [String]$Name 
) 

return [RegEx]::Replace($Name, "[{0}]" -f ([RegEx]::Escape([String][System.IO.Path]::GetInvalidFileNameChars())), '')} 

उत्तर

26

कास्टिंग System.String के चरित्र सरणी वास्तव में रिक्त स्थान के साथ सरणी तत्व शामिल होने के लिए, जिसका अर्थ है के रूप में

[System.IO.Path]::GetInvalidFileNameChars() -join ' ' 

कि

[string][System.IO.Path]::GetInvalidFileNameChars() 

ही करता है जब आप वास्तव में चाहते हैं लगता है

[System.IO.Path]::GetInvalidFileNameChars() -join '' 

@mjolinor उल्लेख किया गया (+1), यह 01 के कारण होता है($OFS)।

साक्ष्य:

PS C:\>[RegEx]::Escape([string][IO.Path]::GetInvalidFileNameChars()) 
"\ \ \|\ \ ☺\ ☻\ ♥\ ♦\ ♣\ ♠\ \\ \t\ \n\ ♂\ \f\ \r\ ♫\ ☼\ ►\ ◄\ ↕\ ‼\ ¶\ §\ ▬\ ↨\ ↑\ ↓\ →\ ←\ ∟\ ↔\ ▲\ ▼\ :\ \*\ \?\ \\\/
PS C:\>[RegEx]::Escape(([IO.Path]::GetInvalidFileNameChars() -join ' ')) 
"\ \ \|\ \ ☺\ ☻\ ♥\ ♦\ ♣\ ♠\ \\ \t\ \n\ ♂\ \f\ \r\ ♫\ ☼\ ►\ ◄\ ↕\ ‼\ ¶\ §\ ▬\ ↨\ ↑\ ↓\ →\ ←\ ∟\ ↔\ ▲\ ▼\ :\ \*\ \?\ \\\/
PS C:\>[RegEx]::Escape(([IO.Path]::GetInvalidFileNameChars() -join '')) 
"\| ☺☻♥♦\t\n♂\f\r♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼:\*\?\\/ 
PS C:\>$OFS='' 
PS C:\>[RegEx]::Escape([string][IO.Path]::GetInvalidFileNameChars()) 
"\| ☺☻♥♦\t\n♂\f\r♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼:\*\?\\/

कुछ इस तरह करने के लिए अपने समारोह बदलें:

Function Remove-InvalidFileNameChars { 
    param(
    [Parameter(Mandatory=$true, 
     Position=0, 
     ValueFromPipeline=$true, 
     ValueFromPipelineByPropertyName=$true)] 
    [String]$Name 
) 

    $invalidChars = [IO.Path]::GetInvalidFileNameChars() -join '' 
    $re = "[{0}]" -f [RegEx]::Escape($invalidChars) 
    return ($Name -replace $re) 
} 

और यह आप क्या चाहते हैं क्या करना चाहिए।

+0

एक समाधान समाधान को समझाने और पोस्ट करने के लिए बहुत बहुत धन्यवाद! – MKANET

5

मुझे लगता है यह गैर-प्रदर्शन पात्रों regex ऑपरेशन के लिए करने के लिए [स्ट्रिंग] मजबूर किया जा रहा है (और रिक्त स्थान के रूप में व्यक्त समाप्त) से कोई लेना देना नहीं है।

([char[]]$name | where { [IO.Path]::GetinvalidFileNameChars() -notcontains $_ }) -join '' 

कि एक सीधे चार तुलना करना होगा, और (एम्बेडेड रिक्त स्थान नहीं निकाले जाते) और अधिक विश्वसनीय लगता है:

अगर यह बेहतर काम नहीं करता है देखें।

$name = 'abc*\ def.txt' 
([char[]]$name | where { [IO.Path]::GetinvalidFileNameChars() -notcontains $_ }) -join '' 

abc def.txt 

संपादित करें - मेरा मानना ​​है कि @ एन्गरगर स्ट्रिंग के लिए वर्ण सरणी कास्टिंग करके होने वाली जगह के बारे में सही है। अंतरिक्ष $ ओएफएस द्वारा पेश किया जा रहा है।

+0

उत्कृष्ट समाधान को बदलने के लिए रोब मैच के लिए। –

0

[System.IO.Path]::GetInvalidFileNameChars() अमान्य वर्णों की एक श्रृंखला देता है। यदि यह आपके लिए स्पेस कैरेक्टर लौटा रहा है (जो यह मेरे लिए नहीं करता है), तो आप हमेशा सरणी पर फिर से सक्रिय हो सकते हैं और इसे हटा सकते हैं।

> $chars = @() 
> foreach ($c in [System.IO.Path]::GetInvalidFileNameChars()) 
    { 
    if ($c -ne ' ') 
    { 
     $chars += $c 
    } 
    } 

तो फिर तुम $chars उपयोग कर सकते हैं के रूप में आप GetInvalidFileNameChars() से उत्पादन के लिए इस्तेमाल किया गया होगा।

2

तो अंतरिक्ष अंतरिक्ष साथ बदल दिया है

$Filename = $ADUser.SamAccountName 
[IO.Path]::GetinvalidFileNameChars() | ForEach-Object {$Filename = $Filename.Replace($_," ")} 
$Filename = "folder\" + $Filename.trim() + ".txt" 
+0

आसान और साफ! – tbolender

0

समान ही अंतर्निहित समारोह के साथ इस एक लाइनर का प्रयास करें मैं रिक्त स्थान सभी अवैध अक्षर को बदलने के लिए करना चाहता था।

'?Some "" File Name <:.txt' -match ("[{0}]"-f (([System.IO.Path]::GetInvalidFileNameChars()|%{[regex]::Escape($_)}) -join '|'))

,

'?Some "" File Name <:.txt' -replace ("[{0}]"-f (([System.IO.Path]::GetInvalidFileNameChars()|%{[regex]::Escape($_)}) -join '|')),'_'

संबंधित मुद्दे