Sam*_*mir 7 windows script batch shell-script batch-file
我有一个名为 Export.txt 的纯文本文件。它包含一个地理位置列表,前面是一个带前导零的 3 位数字。
例子
--START OF FILE--
001 Aberdeen
002 Bellevue
003 Camas
004 Davenport
005 Edgewood
006 Ferndale
007 George
008 Harrington
009 Ilwaco
010 Kahlotus
--END OF FILE--
Run Code Online (Sandbox Code Playgroud)
如何编写脚本或批处理文件来读取文件中的每一行并在 NTFS 分区的给定位置创建一个具有此名称的文件夹?
笔记!请注意,文件夹名称必须包含数字。将上面的列表视为文件夹的实际列表。
更新!我要创建的实际文件夹列表是 245,范围从 001 到 245。这是前几行。
--START OF FILE--
001 Harberget
002 Långflon
003 Källegrafsrös
004 Badstuknappen
005 Aspberget
006 Knipen
007 Halsjön
008 N Finnskoga
009 Båtstad
010 Tisjön
.
.
.
.
245 Milskär
--END OF FILE--
Run Code Online (Sandbox Code Playgroud)
完整列表可以在这里找到:http : //pastebin.com/SNde4bBN
Martin 提供的 PS 脚本不能很好地处理 Å、Ä 和 Ö 等字符。它只在文本文件中找到的 245 个文件夹中创建了 116 个文件夹。它跳过包含这些字符之一的每一行。所以它跳过002 Långflon
,003 Källegrafsrös
例如,但它创建001 Harberget
和004 Badstuknappen
。
这是一个可以执行您想要的操作的 Powershell 脚本。
$folder="X:\Test"; # Directory to place the new folders in.
$txtFile="X:\Test\Export.txt"; # File with list of new folder-names
$pattern="\d+.+"; # Pattern that lines must match
get-content $txtFile | %{
if($_ -match $pattern)
{
mkdir "$folder\$_";
}
}
Run Code Online (Sandbox Code Playgroud)
这将包括名称中的数字。
要运行脚本,请执行以下操作。
Set-ExecutionPolicy RemoteSigned
,然后按Enter启用脚本的运行。出现提示时按 Y。X:\Test
为要创建新文件夹的位置的绝对路径。X:\Test\Export.txt
为包含要用于这些文件夹的名称的文本文件的绝对路径。\d+.+
为行必须匹配的模式。
\d+
匹配任何数字.+
匹配任何字符。.ps1
扩展名。截图...
使用 Windows XP SP3、Vista SP2 和 Windows 7 SP1 进行测试。它是一个特制的批处理脚本,带有嵌入式 VB 脚本,可以完成实际工作。通过这种方式,您将获得一个脚本,该脚本应该与 XP SP2 之后发布的任何操作系统兼容。主要归功于jeb和dbenham,他们提出(并改进)了此处使用的混合技术。
REM^ &@echo off>nul
REM^ &if "%~2" == "" exit /b 2
REM^ &pushd "%~2"
REM^ &cscript //e:vbscript //nologo "%~f0" "%~1"
REM^ &popd
REM^ &exit /b
Dim stream, text, lines, fso
Set stream = CreateObject("ADODB.Stream")
stream.Open
stream.Type = 2
stream.Charset = "utf-8"
stream.LoadFromFile Wscript.Arguments(0)
text = stream.ReadText
stream.Close
lines = Split(text, vbCrLf)
Set fso = CreateObject("Scripting.FileSystemObject")
For i = 0 To UBound(lines)
fso.CreateFolder(lines(i))
Next
Run Code Online (Sandbox Code Playgroud)
将上面的脚本复制并粘贴到记事本或任何其他纯文本编辑器(例如 Notepad++)中。
将其另存为CreateFolders.cmd
或任何您想要的名称。只要确保保留.cmd
扩展名。
打开命令提示符并导航到保存文件的文件夹:
cd /d "X:\Folder\containing\CreateFolders.cmd"
Run Code Online (Sandbox Code Playgroud)通过将列表文件和目标文件夹分别指定为第一个和第二个参数来运行批处理脚本:
CreateFolders.cmd "X:\Some\folder\Export.txt" "X:\Destination\folder"
Run Code Online (Sandbox Code Playgroud)以下 PowerShell 脚本复制了上述解决方案。它接受两个参数,第一个是列表文件(假定保存为 UTF-8),第二个是目标文件夹。使用 Windows XP SP3、Vista SP2 和 Windows 7 SP1 进行测试。
注意Windows PowerShell 2.0 与 Windows 7 捆绑在一起,但需要在 XP/Vista 中手动安装。对于 Windows XP,您需要安装 .NET Framework 2.0 SP1/SP2 或 .NET Framework 3.5 SP1,其中包括 .NET Framework 2.0 SP2。Windows 8 和 Windows 8.1 分别包含 PowerShell 3.0 和 4.0。
if ($args.Count -gt 1)
{
$file=$args[0];
$dest=$args[1];
Get-Content $file -Encoding UTF8 | %{ md "$dest\$_" >$null; }
}
Run Code Online (Sandbox Code Playgroud)
将上面的脚本复制并粘贴到记事本或任何其他纯文本编辑器(例如 Notepad++)中。
将其另存为CreateFolders.ps1
(或任何其他名称,只要您保留正确的扩展名)。
要运行该脚本,您可以启动 PowerShell,然后:
导航到实际路径,然后执行它:
cd "C:\Some folder"
& ".\CreateFolders.ps1" "X:\Some\folder\Export.txt" "X:\Destination\folder"
Run Code Online (Sandbox Code Playgroud)直接指定完整路径来执行:
& "C:\Some folder\CreateFolders.ps1" "X:\Some\folder\Export.txt" "X:\Destination\folder"
Run Code Online (Sandbox Code Playgroud)&
是呼叫运算符。
作为替代方案,您可以从常规命令提示符启动它:
powershell -ExecutionPolicy Bypass -NoLogo -NoProfile -File "C:\Some folder\CreateFolders.ps1" "X:\Some\folder\Export.txt" "X:\Destination\folder"
Run Code Online (Sandbox Code Playgroud)警告!除非您事先知道目标系统和您正在处理的数据,否则不要使用它们。如果您仍然想要,请确保它们按预期工作。
以下脚本将遍历列表文件的所有行并创建尽可能多的文件夹,以实际行内容命名它们。该脚本接受两个参数:第一个是存储列表的路径,它被硬编码为Export.txt
(随意放置不同的文件名,但避免空格);后者是目标文件夹。
@echo off
setlocal
REM make sure there are enough parameters
if "%~2" == "" exit /b 2
REM set the working directory
pushd "%~1"
REM loop through the list and create the folders
for /f "delims=" %%G in (Export.txt) do (md "%~2\%%~G")
REM restore the working directory and exit
popd
endlocal & exit /b
Run Code Online (Sandbox Code Playgroud)
这个脚本与上面的类似,但在这种情况下,文本文件不是直接读取的,而是通过type
命令输出解析的。所述chcp
首先需要以编码更改为UTF-8。在这种情况下,列表不是硬编码的,而是必须指定为第一个参数的一部分。第二个参数是目标文件夹。
@echo off
setlocal
REM make sure there are enough parameters
if "%~2" == "" exit /b 2
REM set the working directory
pushd "%~2"
REM set the list file
set file="%~1"
REM set the encoding to UTF-8
chcp 65001 >nul
REM loop through the list and create the folders
for /f "delims=" %%G in ('type %file%') do (md "%%~G")
REM restore the working directory and exit
popd
endlocal & exit /b
Run Code Online (Sandbox Code Playgroud)
chcp 65001
命令将停止批处理脚本的执行,从而跳过任何其他命令。