Path: ...!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!eternal-september.org!.POSTED!not-for-mail From: et99 Newsgroups: comp.lang.tcl Subject: Re: Problems with paths of Windows Date: Sun, 18 May 2025 12:17:44 -0700 Organization: A noiseless patient Spider Lines: 73 Message-ID: <100dboq$1544i$1@dont-email.me> References: <100ae16$fom5$1@dont-email.me> <100aepq$frvv$1@dont-email.me> <100co5a$10n61$1@dont-email.me> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Injection-Date: Sun, 18 May 2025 21:17:46 +0200 (CEST) Injection-Info: dont-email.me; posting-host="3fc69152c330c9119fca7e9b5bc332a7"; logging-data="1216658"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX1//wgIf0DZhF7qJMHut2S88" User-Agent: Mozilla Thunderbird Cancel-Lock: sha1:dpC6nq7tESM1qRkY8q/LQW2Eakw= Content-Language: en-US In-Reply-To: <100co5a$10n61$1@dont-email.me> Bytes: 3812 On 5/18/2025 6:41 AM, Alan Grunwald wrote: > On 18/05/2025 03:36, Luis Alejandro Muzzachiodi wrote: >> El 17/05/2025 a las 13:51, saito escribió: >>> On 5/17/2025 12:37 PM, Luis Alejandro Muzzachiodi wrote: >>>> Hello, >>>> >>>> I have a procedure that accepts a list of paths. >>>> Assuming "$::env(SystemRoot)\my dir" is passed as a parameter, is there a way to process this so that it's interpreted correctly in the end? >>>> I've tried combinations of { }, [list], [file normalize], [file nativename] but that didn't work. >>>> (Working in Windows, tcl 8.6) >>>> >>> >>> It is not clear what you are asking. >>> >>> Are you trying to append a parameter to a list? You do "lappend mylist $parameter" >>> >>> Are you trying to modify the Windows path env variable?  It is just a string separated by commas: "append env(path) \;[join $mylist \;]" >> >> The question - generalizing - is how (if it is possible) to convert a path into a valid path if passed as a parameter to a procedure in the Windows format, for example, "c:\windows\my dir". >> The specific question would be: >> given the following procedure >> proc myproc { listofpaths } { >>      foreach p  $listofpaths { >>          puts "$p - is valid? : [file isdirectory $p]" >>      } >> } >> if a parameter is passed as "$::env(SystemRoot)\my dir" >> the result obtained is >> C:Windowsmy - is valid? : 0 >> dir - is valid? : 0 >> Then, is there a way to convert - within the procedure - that input into a valid directory? >> >> Alejandro >> >> >> >> >> > It seems that the caller is mangling the parameter; it will be too late by the time the proc is entered. > > I suggest you try passing [file join $::env(SystemRoot) "my dir"]. If you feel that lots of up-front, non-portable string manipulation is more readable you might prefer "$::env(SystemRoot)\\my dir". > > Alan Just to (hopefully) add a little more clarity, one can see why that result occurs, with this: % puts "$::env(SystemRoot)\my dir" C:\WINDOWSmy dir The \m became simply m, because of rule 9, \ followed by something NOT special (like \n), simply removes the \ Then the foreach treats it's input as though lindex were used on each item in a list: % lindex "$::env(SystemRoot)\my dir" 0 C:WINDOWSmy % lindex "$::env(SystemRoot)\my dir" 1 dir Here, you are getting another round of substitution on the \W which likewise removed the \ which all together then, explains why those 2 results showed up. In the above, one would actually need another \ as so: % puts "|$::env(SystemRoot)\\my\ dir|" |C:\WINDOWS\my dir| with the ||'s added to hopefully add more clarity. -e