Reputation: 73
The point of this odd little script is just to let me choose a directory and have whatever is in my clipboard written to a text file in that path. This path will unfortunately always contain parentheses, brackets, and sometimes braces.
Y:
Function Get-Folder($initialDirectory="")
{
[System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms")|Out-Null
$foldername = New-Object System.Windows.Forms.FolderBrowserDialog
$foldername.Description = "Select a folder"
$foldername.rootfolder = "MyComputer"
$foldername.SelectedPath = $initialDirectory
if($foldername.ShowDialog() -eq "OK")
{
$folder += $foldername.SelectedPath
}
return $folder
}
$myFolder = Get-Folder('Y:\MyStuff (OtherStuff)')
Get-Clipboard > $myFolder\myFile.txt
Because of the brackets in the subfolder, I get this error message
out-file : Cannot perform operation because the wildcard path Y:\MyStuff
(OtherStuff)\Sub1\Sub2 [Info] [Some More Info]\myFile.txt did not resolve to a file.
At line:22 char:1
+ Get-Clipboard > $myFolder\myFile.txt
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : OpenError: (Y:\Music (MyStu...nfo]\myFile.txt:Stri
ng) [Out-File], FileNotFoundException
+ FullyQualifiedErrorId : FileOpenFailure,Microsoft.PowerShell.Commands.OutF
ileCommand
No amount of -replace combinations to account for the escape characters using ' or \ has resulted in success. How can I format the string so it resolves to a real directory?
Second question Is there a way to select a path with the more user-friendly FileBrowserDialog instead of FolderBrowser where you can't type or paste in a path?
Upvotes: 2
Views: 2499
Reputation: 437218
Regrettably, > $myFolder\myFile.txt
is the equivalent of
| Out-File -FilePath $myFolder\myFile.txt
, and the -FilePath
parameter[1] interprets its argument as a wildcard expression, in which [
and ]
have special meaning.
The workaround is to use the Out-File
cmdlet - or with text input, the Set-Content
cmdlet - with the -LiteralPath
parameter, which uses its argument(s) literally (verbatim):
Get-Clipboard | Out-File -LiteralPath $myFolder\myFile.txt
Note: In Windows PowerShell, Out-File
and Set-Content
use different default character encodings; in PowerShell [Core] v6+, BOM-less UTF-8 is consistently used - see this answer.
To specify the desired encoding explicitly, use the -Encoding
parameter.
[1] Note: In other cmdlets the equivalent parameter is named just -Path
; in PowerShell [Core] v6+, this inconsistency was corrected, and Out-File
there supports both -FilePath
and -Path
interchangeably.
Upvotes: 2
Reputation: 8868
This function may answer question 2. It will even let you choose a directory inside a zip folder. Optional InitialDirectory and message.
function Get-Folder {
Param(
$initialDirectory = 17,
$message = "Choose a directory"
)
$shell = New-Object -ComObject Shell.Application
$selection = $shell.browseforfolder(0,$message,65556,$initialDirectory)
if($selection){$selection.self.path}
}
get-folder 'c:\some\pa(th)'
Upvotes: 1